逐列匹配展平R数据帧中的行

Posted

技术标签:

【中文标题】逐列匹配展平R数据帧中的行【英文标题】:Flatten rows in R data frame by column match 【发布时间】:2016-04-13 18:14:40 【问题描述】:

我有一个看起来像这样的数据集。

  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

我正在尝试将行展平,以便每个收件人每年只有一行。我想将金额变量转换为等于当年所有金额的总和。我的理想结果是这样的:

  year recipient amount id
1 1973    AG      35     7
2 1974    BE      42     7
3 1975    AG      45     7

我尝试编写一个循环来完成此操作,但我认为必须有一种我不熟悉的更简单的方法。也许是包中某处的地图或展平功能?

【问题讨论】:

aggregate(amount ~ ., data, sum) 【参考方案1】:

这是一个使用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)]

【讨论】:

【参考方案2】:

对于这个简单的例子来说,它可能比你需要的更强大,但是对于这种事情,我喜欢 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 会非常方便。

【讨论】:

【参考方案3】:

试试:

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

【讨论】:

谢谢!这是完美的。 我不熟悉 dplyr,如果这是一个愚蠢的问题,请原谅我。我如何在结果数据集中保持其他变量保持不变,比如我刚刚添加到问题中的 id 变量? 您只需将该变量作为进一步的分组变量。我编辑了答案 我可以用它来平展带有字符串值的行,其中所需的摘要只是取非空值(我知道所有相关行中总是只有 1 个)?我该怎么做?

以上是关于逐列匹配展平R数据帧中的行的主要内容,如果未能解决你的问题,请参考以下文章

如果日期介于第二个数据帧中的两个日期之间,则 r 标记第一个数据帧中的行

R-匹配两个数据帧中的两列

在将其组合到R中的一个数据帧时,在不同的数据帧中保留重复的行名[重复]

R将数据帧中的字符串匹配替换为来自另一个数据帧/数组的值

在pandas数据帧中的行之间添加随机数据

R:从一个数据帧中提取行,基于列名匹配来自另一个数据帧的值