R通过大量列进行聚合

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$

我有一个数据帧(df),大约有40列,我想使用其中4列的总和进行聚合。除了我要求和的4列之外,第1列中的每个唯一值对应于其余列中的相同值,我希望将所有列保留在聚合数据框中。是否有任何方法可以指定by=list()部分中的列,而不必显式键入它们?例如,如果我知道我想将列“field”和列1-36相加。我试过了

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)

这就是我要找的,只是第一个发帖子的人基本上拥有相同的东西。谢谢你!这就是我要找的,只是第一个发帖子的人基本上有相同的东西。谢谢你!