Как эффективно создать таблицу 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 2

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