Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R根据多个条件聚合数据列_R_Aggregate - Fatal编程技术网

R根据多个条件聚合数据列

R根据多个条件聚合数据列,r,aggregate,R,Aggregate,我试图按两个类别汇总数据 数据 year person expense sex money 2011 kevin truck M 1 2011 mike truck M 62 2011 sally truck F 60 2012 kevin truck M 37 2012 mike truck M 53 2012 sally truck F 95 2013 kevin

我试图按两个类别汇总数据

数据

year    person  expense sex money
2011    kevin   truck   M   1
2011    mike    truck   M   62
2011    sally   truck   F   60
2012    kevin   truck   M   37
2012    mike    truck   M   53
2012    sally   truck   F   95
2013    kevin   truck   M   21
2013    mike    truck   M   13
2013    sally   truck   F   38
2014    kevin   truck   M   48
2014    mike    truck   M   4
2014    sally   truck   F   77
2011    kevin   house   M   7
2011    mike    house   M   94
2011    sally   house   F   79
2012    kevin   house   M   86
2012    mike    house   M   42
2012    sally   house   F   46
2013    kevin   house   M   90
2013    mike    house   M   76
2013    sally   house   F   75
2014    kevin   house   M   70
2014    mike    house   M   91
2014    sally   house   F   62
如果“年”和“人”列相匹配,我想对“钱”列求和

所需输出

year    person  sex money
2011    kevin   M   8
2011    mike    M   156
2011    sally   F   139
2012    kevin   M   123
2012    mike    M   95
2012    sally   F   141
2013    kevin   M   111
2013    mike    M   89
2013    sally   F   113
2014    kevin   M   118
2014    mike    M   95
2014    sally   F   139
我该怎么做

我尝试了
data\u aggregated=aggregate(data$money,by=list(name=data$name),FUN=sum)
,但那只是按名称聚合数据。我不知道如何按姓名和年份合计。它还创建了一个只有两个变量列的数据框:
name
x


我还尝试将name+year连接到一个ID变量中,但这似乎太繁琐了。

您可以从下面的公式路由或列表方法中进行选择。如果您还想要“性别”列,可以将其与其他列一样添加:

aggregate(money ~ person + year + sex, data, sum)
或者你的方法:

aggregate(data$money, by = list(person=data$person, year=data$year, sex=data$sex), FUN=sum)
一揽子办法包括:

library(dplyr)
data %>% group_by(person, year, sex) %>% summarise(mon_sum=sum(money))
# Source: local data table [12 x 4]
# Groups: person, year
# 
# person  year    sex mon_sum
# (fctr) (int) (fctr)   (int)
# 1   kevin  2011      M       8
# 2    mike  2011      M     156
# 3   sally  2011      F     139
# 4   kevin  2012      M     123
# 5    mike  2012      M      95
# 6   sally  2012      F     141
# 7   kevin  2013      M     111
# 8    mike  2013      M      89
# 9   sally  2013      F     113
# 10  kevin  2014      M     118
# 11   mike  2014      M      95
# 12  sally  2014      F     139
使用
数据。表格
。该方法在性能和编程时间方面最为有效,非常值得学习:

library(data.table)
setDT(data)[,sum(money), by=.(person,year, sex)]

您可以从下面的公式路由或列表方法中进行选择。如果您还想要“性别”列,可以将其与其他列一样添加:

aggregate(money ~ person + year + sex, data, sum)
或者你的方法:

aggregate(data$money, by = list(person=data$person, year=data$year, sex=data$sex), FUN=sum)
一揽子办法包括:

library(dplyr)
data %>% group_by(person, year, sex) %>% summarise(mon_sum=sum(money))
# Source: local data table [12 x 4]
# Groups: person, year
# 
# person  year    sex mon_sum
# (fctr) (int) (fctr)   (int)
# 1   kevin  2011      M       8
# 2    mike  2011      M     156
# 3   sally  2011      F     139
# 4   kevin  2012      M     123
# 5    mike  2012      M      95
# 6   sally  2012      F     141
# 7   kevin  2013      M     111
# 8    mike  2013      M      89
# 9   sally  2013      F     113
# 10  kevin  2014      M     118
# 11   mike  2014      M      95
# 12  sally  2014      F     139
使用
数据。表格
。该方法在性能和编程时间方面最为有效,非常值得学习:

library(data.table)
setDT(data)[,sum(money), by=.(person,year, sex)]

使用
dplyr
,这非常简单:

library(dplyr)
df %>% group_by(year, person, sex) %>% summarise(money = sum(money))
返回

Source: local data frame [12 x 4]
Groups: year [?]

    year person    sex money
   (int) (fctr) (fctr) (int)
1   2011  kevin      M     8
2   2011   mike      M   156
3   2011  sally      F   139
4   2012  kevin      M   123
5   2012   mike      M    95
6   2012  sally      F   141
7   2013  kevin      M   111
8   2013   mike      M    89
9   2013  sally      F   113
10  2014  kevin      M   118
11  2014   mike      M    95
12  2014  sally      F   139

使用
dplyr
,这非常简单:

library(dplyr)
df %>% group_by(year, person, sex) %>% summarise(money = sum(money))
返回

Source: local data frame [12 x 4]
Groups: year [?]

    year person    sex money
   (int) (fctr) (fctr) (int)
1   2011  kevin      M     8
2   2011   mike      M   156
3   2011  sally      F   139
4   2012  kevin      M   123
5   2012   mike      M    95
6   2012  sally      F   141
7   2013  kevin      M   111
8   2013   mike      M    89
9   2013  sally      F   113
10  2014  kevin      M   118
11  2014   mike      M    95
12  2014  sally      F   139

太好了,谢谢!我更喜欢dplyr方法,因为它保留了所有其他ID变量。一个问题:当我使用不同的数据集尝试此方法时,我会得到以下错误:“error:length(rows)==1不正确”如果看不到部分数据,很难判断。我会再次检查它是否是
data.frame
。使用
str(df)
进行检查以确保。使用其他故障排除技术查看该数据集与原始数据集之间的差异。这很好,谢谢!我更喜欢dplyr方法,因为它保留了所有其他ID变量。一个问题:当我使用不同的数据集尝试此方法时,我会得到以下错误:“error:length(rows)==1不正确”如果看不到部分数据,很难判断。我会再次检查它是否是
data.frame
。使用
str(df)
进行检查以确保。使用其他故障排除技术查看该数据集与原始数据集之间的差异。一个问题:当我使用不同的数据集尝试此操作时,会出现以下错误:“error:length(rows)==1不正确”,但看不到数据的结构,这很难说。猜测:如果您试图用
length
替换
sum
,那么使用
dplyr::n
可以避免一些问题。一个问题:当我使用不同的数据集尝试此操作时,我会得到以下错误:“error:length(rows)==1不正确”,但看不到数据的结构,很难说。猜测:如果您试图用
length
替换
sum
,那么使用
dplyr::n
可以避免一些问题。