如何使用dplyr根据列id合并行数据
我正在尝试确定基于两列选择将数据帧中的一组行折叠为一行的最佳方法 例如:如何使用dplyr根据列id合并行数据,r,dplyr,R,Dplyr,我正在尝试确定基于两列选择将数据帧中的一组行折叠为一行的最佳方法 例如: | State |Fatalities|Injuries|Dmg |Dmg|year|eventType| PropExp | CropExp | | ------|----------|--------|------|---|----|---------|---------|---------| | WA | 1 | 100 |25.00 |0 |1971|HAIL |
| State |Fatalities|Injuries|Dmg |Dmg|year|eventType| PropExp | CropExp |
| ------|----------|--------|------|---|----|---------|---------|---------|
| WA | 1 | 100 |25.00 |0 |1971|HAIL |1000000 |1 | 0 |
| WA | 6 | 200 |25.00 |0 |1972|TORNADO |1000000 |1 | 1 |
| WA | 2 | 300 |25.00 |0 |1973|SNOW |1000000 |1 | 0 |
| WA | 6 | 900 |65.00 |0 |1973|TORNADO |1000000 |1 | 1 |
| WA | 4 | 300 |25.00 |0 |1973|TORNADO |1000000 |1 | 0 |
| WA | 0 | 900 |65.00 |0 |1972|TORNADO |1000000 |1 | 1 |
目的是按事件类型合并和添加每年的行。。。因此,我们将1973 TORNADO行折叠为一行-添加选定的行数据并创建新的合并数据行
| State |Fatalities|Injuries|Dmg |Dmg|year|eventType| PropExp | CropExp |
| ------|----------|--------|------|---|----|---------|---------|---------|
| WA | 1 | 100 |25.00 |0 |1971|HAIL |1000000 |1 | 0 |
| WA | 6 | 200 |25.00 |0 |1972|TORNADO |1000000 |1 | 1 |
| WA | 2 | 300 |25.00 |0 |1973|SNOW |1000000 |1 | 0 |
| WA | 10 | 1200 |90.00 |0 |1973|TORNADO |1000000 |1 | 1 |
| WA | 0 | 900 |65.00 |0 |1972|TORNADO |1000000 |1 | 1 |
注:我使用的是Coursera可再生研究课程中的示例数据集——我之前完成过。这个问题与课程等无关-我正在尝试折叠一个不同的数据集,我想知道如何在R中干净地完成这项工作
我错过了什么
感谢所有帮助。除了评论中提到的dplyr解决方案@Khashaa外,您还可以在base R off course中这样做:
aggregate(cbind(Fatalities, Injuries, Dmg, Dmg.1, PropExp, CropExp) ~ State + year + eventType, data = df, sum)
这使得:
State year eventType Fatalities Injuries Dmg Dmg.1 PropExp CropExp
1 WA 1971 HAIL 1 100 25 0 1000000 1
2 WA 1973 SNOW 2 300 25 0 1000000 1
3 WA 1972 TORNADO 6 1100 90 0 2000000 2
4 WA 1973 TORNADO 10 1200 90 0 2000000 2
或者,您也可以使用data.table:
这会给你同样的结果
data.table解决方案和带有summary_的dplyr解决方案的缺点是所有列都被求和。从所需的输出判断,您不希望PropExp和CropExp相加。您可以通过在data.table中用.SDcols或在dplyr中用select指示必须汇总的列来实现这一点:
这两者都会导致:
State year eventType Fatalities Injuries Dmg
1: WA 1971 HAIL 1 100 25
2: WA 1972 TORNADO 6 1100 90
3: WA 1973 SNOW 2 300 25
4: WA 1973 TORNADO 10 1200 90
当然,您也可以在base R中执行此操作:
aggregate(cbind(Fatalities, Injuries, Dmg) ~ State + year + eventType, data = df, sum)
除了提供的功能外,更干净的方法是使用plyr的ddply功能:
library(plyr)
ddply(df, .(year, eventType), numcolwise(sum))
您可以转置数据t,然后使用适当的by vars进行聚合,然后将结果转置回原处。或者你可以采取转置和重塑。肖恩-谢谢你能帮我举一个更具体的例子吗?propertyDamageSummary%filterSTATE='WA%%>%group\u byeventBeginYear,eventType%%>%?'df%%>%group\u byState,year,eventType%%>%Summary\u Eachfunsumkhasha-感谢您的帮助-您发布的解决方案将状态值相加-我如何排除该值?我真的很感谢你在这里的帮助。卡沙-我打错了-你的解决方案有效-谢谢!好业力飞向你的方向。Jaap-感谢你的帮助和见解-非常感谢。
aggregate(cbind(Fatalities, Injuries, Dmg) ~ State + year + eventType, data = df, sum)
library(plyr)
ddply(df, .(year, eventType), numcolwise(sum))