首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在函数中使用命名变量

如何在函数中使用命名变量
EN

Stack Overflow用户
提问于 2018-06-29 06:23:22
回答 2查看 100关注 0票数 1

假设下面的虚拟数据帧:

代码语言:javascript
复制
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=):

代码语言:javascript
复制
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个级别),我将很高兴摆脱它。我非常感谢任何解决这个问题的指针!谢谢。

代码语言:javascript
复制
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]
    }
  )
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-06-29 08:24:52

您可以将outer与矢量化函数一起使用,也可以使用Map,如下所示:

代码语言:javascript
复制
m = function(x,y)dt[, .(mean=mean(get(y)), sd=sd(get(y))), by=x]

c(outer(factorList,measureList,Vectorize(m)))

代码语言:javascript
复制
Map(m,rep(factorList,each=length(measureList)),measureList)

编辑:

要拥有这些名称:

代码语言:javascript
复制
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)))
票数 1
EN

Stack Overflow用户

发布于 2018-06-29 06:51:46

这使用了dplyrpurrr,但我认为它可以工作。

代码语言:javascript
复制
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)))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51091944

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档