按列匹配展平 R 数据帧中的行
Flatten rows in R data frame by column match
我有一个看起来像这样的数据集。
year recipient amount id
1 1973 AG 17 7
2 1973 AG 18 7
3 1974 BE 20 9
4 1974 BE 22 9
5 1975 AG 20 7
6 1975 AG 25 7
我正在尝试将行展平,以便每个收件人每年只有一行。我想将 amount 变量转换为等于当年所有金额的总和。我理想的结果是这样的:
year recipient amount id
1 1973 AG 35 7
2 1974 BE 42 7
3 1975 AG 45 7
我尝试编写一个循环来完成此操作,但我认为必须有一种我不熟悉的更简单的方法。也许是包中某处的 map 或 flatten 函数?
尝试:
library(dplyr)
df %>% group_by(year, recipient, id) %>% summarise(amount=sum(amount))
Source: local data frame [3 x 4]
Groups: year, recipient
year recipient id amount
1 1973 AG 7 35
2 1974 BE 9 42
3 1975 AG 7 45
对于这个简单的例子,它可能比你需要的更强大,但对于这类事情,我喜欢 sqldf 库,它允许你使用 SQL 像操作数据库表一样操作数据框。你的情况
library(sqldf)
newdf <- sqldf("SELECT year,recipient,id,sum(amount) as amount from olddf group by year,recipient,id")
默认情况下它使用 SQLite 作为后端,因此它可以处理相当复杂的 SQL 语句。我通常发现 R 的数据操作语言有点令人困惑,并且总是必须查找我正在尝试做的事情,因此使用 SQL 会非常方便。
这是一个使用 data.table
的选项
library(data.table)
setDT(df1)[, list(amount=sum(amount), id= id[1L]) ,.(year, recipient)]
# year recipient amount id
#1: 1973 AG 35 7
#2: 1974 BE 42 9
#3: 1975 AG 45 7
或者如果"id"也应该是一个分组变量
setDT(df1)[, list(amount=sum(amount)), .(year, recipient, id)]
我有一个看起来像这样的数据集。
year recipient amount id
1 1973 AG 17 7
2 1973 AG 18 7
3 1974 BE 20 9
4 1974 BE 22 9
5 1975 AG 20 7
6 1975 AG 25 7
我正在尝试将行展平,以便每个收件人每年只有一行。我想将 amount 变量转换为等于当年所有金额的总和。我理想的结果是这样的:
year recipient amount id
1 1973 AG 35 7
2 1974 BE 42 7
3 1975 AG 45 7
我尝试编写一个循环来完成此操作,但我认为必须有一种我不熟悉的更简单的方法。也许是包中某处的 map 或 flatten 函数?
尝试:
library(dplyr)
df %>% group_by(year, recipient, id) %>% summarise(amount=sum(amount))
Source: local data frame [3 x 4]
Groups: year, recipient
year recipient id amount
1 1973 AG 7 35
2 1974 BE 9 42
3 1975 AG 7 45
对于这个简单的例子,它可能比你需要的更强大,但对于这类事情,我喜欢 sqldf 库,它允许你使用 SQL 像操作数据库表一样操作数据框。你的情况
library(sqldf)
newdf <- sqldf("SELECT year,recipient,id,sum(amount) as amount from olddf group by year,recipient,id")
默认情况下它使用 SQLite 作为后端,因此它可以处理相当复杂的 SQL 语句。我通常发现 R 的数据操作语言有点令人困惑,并且总是必须查找我正在尝试做的事情,因此使用 SQL 会非常方便。
这是一个使用 data.table
library(data.table)
setDT(df1)[, list(amount=sum(amount), id= id[1L]) ,.(year, recipient)]
# year recipient amount id
#1: 1973 AG 35 7
#2: 1974 BE 42 9
#3: 1975 AG 45 7
或者如果"id"也应该是一个分组变量
setDT(df1)[, list(amount=sum(amount)), .(year, recipient, id)]