我是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
}
答案 0 :(得分:2)
我猜aggregate
函数可以解决您的问题。我们假设您有一个数据框df
包含三列A
,B
,C
,其名称为:
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)
按系数A
和B
,请尝试:
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