Как эффективно создать таблицу nrow для серии кадров данных?
ОБНОВЛЕНИЕ Используя различные решения, найденные по всему сайту:
Я все еще не могу получить желаемый результат, используя функции стека и ldply:
Желаемый результат будет выглядеть так:
Dataset Samples
1 WGS nrow(WGS.ped)
2 WES nrow(WES.ped.exp)
3 MIPS nrow(MIPS.ped.exp)
1) ldply
: Как присвоить имя столбцам V1
а также .id
?
ldply(list(WGS=WGS.ped, WES=WES.ped.exp, MIPS=mips.ped.exp),
function(l)(Samples=nrow(l)))
.id V1
1 WGS 3908
2 WES 26367
3 MIPS 14193
2) ldply
: Как присвоить имя столбцам V1
а также .id
?
ldply(list(WGS=WGS.ped, WES=WES.ped.exp, MIPS=mips.ped.exp), nrow)
.id V1
1 WGS 3908
2 WES 26367
3 MIPS 14193
3) lapply %>% as.data.frame
: Возвращает имена фреймов данных в виде столбцов, а не в качестве первого столбца.Dataset
".
lapply(list(WGS=WGS.ped, WES=WES.ped.exp, MIPS=mips.ped.exp), nrow) %>%
as.data.frame
WGS WES MIPS
1 3908 26367 14193
4) sapply %>% stack
: Как изменить порядок столбцов? И как указать имена столбцов с stack
?
sapply(list(WGS=WGS.ped, WES=WES.ped.exp, MIPS=mips.ped.exp), nrow) %>%
stack()
values ind
1 3908 WGS
2 26367 WES
3 14193 MIPS
5) map %>% as.data.frame
: Возвращает имена фреймов данных в виде столбцов, а не в качестве первого столбца.Dataset
".
map(list(WGS=WGS.ped, WES=WES.ped.exp, MIPS=mips.ped.exp), nrow) %>%
as.data.frame()
WGS WES MIPS
3908 26367 14193
У меня есть три кадра данных WGS.ped, WES.ped,exp
а также MIPS.ped.exp
,
Я хочу создать новый фрейм данных, который суммирует их количество строк / общее количество строк в каждом фрейме данных.
Желаемый результат будет выглядеть так:
Dataset Samples
WGS nrow(WGS.ped)
WES nrow(WES.ped.exp)
MIPS nrow(MIPS.ped.exp)
Каков эффективный и воспроизводимый способ достижения этого, предпочтительно с помощью dplyr?
Спасибо!
2 ответа
Хорошо, это было особенно интересно. Вот пересмотренное решение, которое требует только dplyr
, Использует преимущества базовой функции mget
, который создает нам именованный список наших фреймов данных, отбирая их из нашей среды R после того, как мы передаем ему вектор имен для поиска.
После этого, это просто вопрос использования .id
в bind_rows()
создать "фиктивный" столбец с именами данных, что позволяет нам аккуратно группировать и суммировать.
library(dplyr)
# Load some built-in dataframes to use as an example
df1 <- mtcars
df2 <- iris
df3 <- PlantGrowth
names_list <- c("df1","df2","df3")
summary_df <- mget(names_list, envir = globalenv()) %>%
bind_rows(.id = "Dataset") %>%
group_by(Dataset) %>%
summarise(Samples = n())
# Output
# A tibble: 3 x 2
Dataset Samples
<chr> <int>
1 df1 32
2 df2 150
3 df3 30
Вот функция base r, которая будет суммировать кадры данных, которые вы передаете ей:
summarize_data <- function(...) {
data <- list(...)
call <- as.character(match.call())
names <- gsub(".*\\((.*)\\).*", "\\1", call)[-1]
data.frame(names = names,
rows = sapply(data, nrow),
stringsAsFactors = FALSE)
}
Это получает:
> summarize_data(mtcars, iris)
names rows
1 mtcars 32
2 iris 150