Как эффективно создать таблицу nrow по ряду фреймов данных?
Обновление с использованием различных решений, найденных на сайте:
Я все еще не могу достичь желаемого результата , используя функции stack и 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
Вот базовая функция 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