如何在一系列数据框架中有效地创建一个nrow表?

时间:2018-04-21 22:04:40

标签: r dataframe dplyr stack lapply

更新使用整个网站中找到的不同解决方案:

我仍然无法使用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,expMIPS.ped.exp

我想创建一个新的数据框,汇总它们的行数/每个数据框中的总行数。

所需的输出如下所示:

Dataset Samples
WGS     nrow(WGS.ped)
WES     nrow(WES.ped.exp)
MIPS    nrow(MIPS.ped.exp)

实现这一目标的有效且可重复的方法是什么,最好使用dplyr?

谢谢!

2 个答案:

答案 0 :(得分:6)

好的,这个特别有趣。这是一个仅需要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

答案 1 :(得分:0)

这是一个基本的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