如何将列表的每个元素作为参数分配给R中的循环中的函数?

时间:2018-04-27 01:54:54

标签: r arguments

我是R的新手。我想基于因子列的组合获得关于数据框(dt)的数字列(例如,列C)的大量统计信息(比如说) ,A列和B列)。首先,我希望通过对A列和B列进行分组,然后单独使用A和仅使用B进行相同的操作来获得结果。我编写了一个类似下面的代码。我有一个我想测试的因子组合列表(groupList),然后对于循环的每次迭代,我将该列表的一个元素作为参数提供给" by"。但是,你肯定可以看到,它不起作用。 R不会将列表的元素识别为函数" by"的参数。关于如何使这项工作的任何想法?欢迎并赞赏任何指针或建议。

groupList <- list(".(A, B)", "A", "B")

for(i in 1:length(groupList)){
  output <- dt[,list(mean=mean(C),
                     sd=sd(C),
                     min=min(C),
                     median=median(C),
                     max=max(C)),
               by = groupList[i]]

  Here insert code to save each output
}

3 个答案:

答案 0 :(得分:2)

我猜aggregate函数可以解决您的问题。我们假设您有一个数据框df包含三列ABC,其名称为:

df<-data.frame(A=rep(letters[1:3],3),B=rep(letters[4:6],each=3),C=1:9)

如果您希望按因素C计算A的平均值,请尝试:

aggregate(formula=C~A,data=df,FUN=mean)

按因子B,尝试:

aggregate(formula=C~B,data=df,FUN=mean)

按系数AB,请尝试:

aggregate(formula=C~A+B,data=df,FUN=mean)

答案 1 :(得分:0)

为了演示,我使用了mtcars数据集。以下是dplyr包的一种方式。

library(dplyr)

# create a vector of functions that you need
describe <- c("mean", "sd", "min", "median", "max")

# group by the variable gear
mtcars %>%
  group_by(gear) %>%
  summarise_at(vars(mpg), describe) 

# group by the variable carb
mtcars %>%
  group_by(carb) %>%
  summarise_at(vars(mpg), describe) 

# group by both gear and carb
mtcars %>%
  group_by(gear, carb) %>%
  summarise_at(vars(mpg), describe) 

答案 2 :(得分:0)

您的groupList可以重新组织为字符向量列表。然后,您可以使用lapply或现有的for循环添加eval()来正确解释by=输入:

set.seed(1)
dt <- data.table(A=rep(1:2,each=5), B=rep(1:5,each=2), C=1:10)

groupList <- list(c("A", "B"), c("A"), c("B"))

lapply(
  groupList,
  function(x) {
    dt[, .(mean=mean(C), sd=sd(C)), by=x]
  }
)

out <- vector("list", 3)
for(i in 1:length(groupList)){
  out[[i]] <- dt[, .(mean=mean(C), sd=sd(C)), by=eval(groupList[[i]]) ]
}

str(out)
#List of 3
# $ :Classes ‘data.table’ and 'data.frame':      6 obs. of  4 variables:
#  ..$ A   : int [1:6] 1 1 1 2 2 2
#  ..$ B   : int [1:6] 1 2 3 3 4 5
#  ..$ mean: num [1:6] 1.5 3.5 5 6 7.5 9.5
#  ..$ sd  : num [1:6] 0.707 0.707 NA NA 0.707 ...
#  ..- attr(*, ".internal.selfref")=<externalptr> 
# $ :Classes ‘data.table’ and 'data.frame':      2 obs. of  3 variables:
#  ..$ A   : int [1:2] 1 2
#  ..$ mean: num [1:2] 3 8
#  ..$ sd  : num [1:2] 1.58 1.58
#  ..- attr(*, ".internal.selfref")=<externalptr> 
# $ :Classes ‘data.table’ and 'data.frame':      5 obs. of  3 variables:
#  ..$ B   : int [1:5] 1 2 3 4 5
#  ..$ mean: num [1:5] 1.5 3.5 5.5 7.5 9.5
#  ..$ sd  : num [1:5] 0.707 0.707 0.707 0.707 0.707