假设下面的虚拟数据帧:
dt <- data.table(A=c("a", "a", "a", "b", "b", "b", "c", "c", "c", "d", "d", "d"),
B=c("e", "e", "e", "e", "e", "e", "f", "f", "f", "f", "f", "f"),
C=1:12,
D=13:24)
我想计算每个数字列("C“和"D")的一些统计特性(例如,平均值和标准差),每次按因子列c("A"),c("B")和c("A",”B“)分组。在实际的数据框中,我有大约40个数值列,10个以不同组合分组的因子列,以及我想要计算的大量统计数据列表。根据我从上一个问题得到的answer ( @thelatemail),我知道我可以使用下面的代码来处理使用列表的因子分组(by=):
groupList <- list(c("A", "B"), c("A"), c("B"))
out <- vector("list", 3)
out <- lapply(
groupList,
function(x) {
dt[, .(mean=mean(C), sd=sd(C)), by=x]
}
)
现在,我想更进一步,创建一个包含数据框中数字列名称列表的变量,并在上面的函数中使用该变量的名称。我编写了以下代码,但不幸的是,它不能工作。我的想法是在每个回合中使用循环从measureList中提取一个值,并将该值放入均值sd函数中。有什么想法吗?循环是我倾向于思考这些事情的方式,但如果它使代码更快或更有效(特别是因为我的一个因子列有90个级别),我将很高兴摆脱它。我非常感谢任何解决这个问题的指针!谢谢。
factorList <- list(c("A"), c("B"), c("A", "B"))
measureList <- list(c("C"), c("D"))
out <- vector("list", 2)
for(i in 1:length(measureList)){
out[[i]] <-lapply(
factorList,
function(x) {
dt[, .(mean=mean(eval(measureList[[i]])),
sd=sd(eval(measureList[[i]]))),
by = x]
}
)
}
发布于 2018-06-29 08:24:52
您可以将outer
与矢量化函数一起使用,也可以使用Map
,如下所示:
m = function(x,y)dt[, .(mean=mean(get(y)), sd=sd(get(y))), by=x]
c(outer(factorList,measureList,Vectorize(m)))
或
Map(m,rep(factorList,each=length(measureList)),measureList)
编辑:
要拥有这些名称:
m = function(x,y)setNames(dt[, .(mean(get(y)),sd(get(y))), by=x],
c(head(names(dt),length(x)),paste(c("mean","sd"),y,sep="_")))
c(outer(factorList,measureList,Vectorize(m)))
发布于 2018-06-29 06:51:46
这使用了dplyr
和purrr
,但我认为它可以工作。
library(dplyr)
library(purrr)
combos <- expand.grid(factorList, measureList)
map2(combos[, 1],
combos[, 2],
~ dt %>% group_by_at(.x) %>% summarize_at(.y, funs(mean, sd)))
https://stackoverflow.com/questions/51091944
复制相似问题