Как эффективно создать таблицу 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
Другие вопросы по тегам