R通过大量列进行聚合
我有一个数据帧(df),大约有40列,我想使用其中4列的总和进行聚合。除了我要求和的4列之外,第1列中的每个唯一值对应于其余列中的相同值,我希望将所有列保留在聚合数据框中。是否有任何方法可以指定by=list()部分中的列,而不必显式键入它们?例如,如果我知道我想将列“field”和列1-36相加。我试过了R通过大量列进行聚合,r,aggregate,R,Aggregate,我有一个数据帧(df),大约有40列,我想使用其中4列的总和进行聚合。除了我要求和的4列之外,第1列中的每个唯一值对应于其余列中的相同值,我希望将所有列保留在聚合数据框中。是否有任何方法可以指定by=list()部分中的列,而不必显式键入它们?例如,如果我知道我想将列“field”和列1-36相加。我试过了 aggregate(df$field, by = list(df[,1:36]), FUN = sum) 但它抛出了一个错误,因为这不是一个名字列表。我也试过了 aggregate(df$
aggregate(df$field, by = list(df[,1:36]), FUN = sum)
但它抛出了一个错误,因为这不是一个名字列表。我也试过了
aggregate(df$field, by = list(names(df)[1:36]), FUN = sum)
虽然这不会给出一个错误,但它会返回一个聚合,将我的df名称作为唯一的观察值
还是我缺少了一种简单的方式来表示“使用数据帧的其余部分聚合这四列?”
谢谢
下面是一个示例数据帧:
A B C D Sum
1 A B C D 1
2 A B C D 2
3 A B C D 3
4 E F 1 R 4
5 E F 1 R 5
聚合后,我希望它看起来像:
A B C D Sum
1 A B C D 6
2 E F 1 R 9
我知道,如果我在聚合语句的“by”部分显式地声明x$A、x$B、x$C、x$D,我可以做到这一点,但在我的实际数据帧中,这将需要显式地键入大约40个字段名。您正在询问如何聚合多个变量的总和,并按剩余变量分组。我将首先组合多个变量,然后使用
aggregate
函数的(我认为)更方便的公式界面进行聚合。例如,考虑基于剩余变量(花瓣宽度和种类)的虹膜数据集的长度、萼片、宽度、花瓣和长度的总和:
agg您正在询问如何聚合多个变量的总和,并按剩余变量分组。我将首先组合多个变量,然后使用aggregate
函数的(我认为)更方便的公式界面进行聚合。例如,考虑基于剩余变量(花瓣宽度和种类)的虹膜数据集的长度、萼片、宽度、花瓣和长度的总和:
agg使用@josilber提到的示例数据,这将是使用dplyr()
实现所需输出的另一个选项,这对于大型数据集更有效
使用数据表
library('data.table')
out = setDT(agg)[, list(sum = sum(sum)), by= names(agg[,!"sum", with=FALSE])]
# Species Petal.Width sum
#1: setosa 0.2 284.1
#2: setosa 0.4 74.6
#3: setosa 0.3 68.1
#4: setosa 0.1 47.8
#5: setosa 0.5 10.1
#6: setosa 0.6 10.1
#7: versicolor 1.4 96.7
#8: versicolor 1.5 136.5
#9: versicolor 1.3 166.5
#10:versicolor 1.6 42.0
# ...
使用@josilber提到的示例数据,这将是使用dplyr()
实现所需输出的另一个选项,这对于大型数据集更为有效
使用数据表
library('data.table')
out = setDT(agg)[, list(sum = sum(sum)), by= names(agg[,!"sum", with=FALSE])]
# Species Petal.Width sum
#1: setosa 0.2 284.1
#2: setosa 0.4 74.6
#3: setosa 0.3 68.1
#4: setosa 0.1 47.8
#5: setosa 0.5 10.1
#6: setosa 0.6 10.1
#7: versicolor 1.4 96.7
#8: versicolor 1.5 136.5
#9: versicolor 1.3 166.5
#10:versicolor 1.6 42.0
# ...
使用data.frame方法(aggregate.data.frame
)如下所示:
aggregate(df["field"], by = df[1:36], FUN = sum)
nms <- c("field", names(df)[1:36])
aggregate(field ~., df, sum)
或者像这样使用公式方法(aggregate.formula
):
aggregate(df["field"], by = df[1:36], FUN = sum)
nms <- c("field", names(df)[1:36])
aggregate(field ~., df, sum)
nms使用data.frame方法(aggregate.data.frame
)如下:
aggregate(df["field"], by = df[1:36], FUN = sum)
nms <- c("field", names(df)[1:36])
aggregate(field ~., df, sum)
或者像这样使用公式方法(aggregate.formula
):
aggregate(df["field"], by = df[1:36], FUN = sum)
nms <- c("field", names(df)[1:36])
aggregate(field ~., df, sum)
nms这将是dplyr的当前答案:
library('dplyr')
mytb<-read.table(text="
A B C D Sum
1 A B C D 1
2 A B C D 2
3 A B C D 3
4 E F 1 R 4
5 E F 1 R 5", header=T, stringsAsFactors=F)
mytb %>%
group_by_at(names(select(mytb, -"Sum") ) ) %>%
summarise_all(.funs=sum)
library('dplyr')
多年结核分枝杆菌%
分组方式(名称(选择(mytb,-“总和”))%>%
总结所有内容(.funs=sum)
这将是dplyr的当前答案:
library('dplyr')
mytb<-read.table(text="
A B C D Sum
1 A B C D 1
2 A B C D 2
3 A B C D 3
4 E F 1 R 4
5 E F 1 R 5", header=T, stringsAsFactors=F)
mytb %>%
group_by_at(names(select(mytb, -"Sum") ) ) %>%
summarise_all(.funs=sum)
library('dplyr')
多年结核分枝杆菌%
分组方式(名称(选择(mytb,-“总和”))%>%
总结所有内容(.funs=sum)
这就是我要找的,只是第一个发帖子的人基本上拥有相同的东西。谢谢你!这就是我要找的,只是第一个发帖子的人基本上有相同的东西。谢谢你!