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
可以避免一些问题。