更新使用整个网站中找到的不同解决方案:
我仍然无法使用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?
谢谢!
答案 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