gpt4 book ai didi

r - 如何使用 dplyr 根据列 id 合并行数据

转载 作者:行者123 更新时间:2023-12-02 21:13:27 26 4
gpt4 key购买 nike

我正在尝试确定基于两列选择将数据框中的一组行折叠为一行的最佳方法。

例如:

| 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 可重现研究类(class)中的示例数据集 - 我之前已完成该类(class)。这个问题与类(class)等无关 - 我正在尝试折叠不同的数据集,我很想知道如何在 R 中干净地完成此操作。

我错过了什么?

我们衷心感谢并感谢所有帮助。

最佳答案

除了 dplyr评论中提到的解决方案@Khashaa,您当然也可以在基础 R 中执行此操作:

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 :

library(data.table)
setDT(df)[, lapply(.SD, sum), by=.(State, year, eventType)]

这会给出相同的结果。

两者的缺点data.table解决方案和 dplyr解决方案 summarize_each是所有列都被求和。从您想要的输出来看,您不需要 PropExp & CropExp总结。您可以通过指示必须使用 .SDcols 进行汇总的列来实现此目的。在data.table或与 selectdplyr :

# data.table
setDT(df)[, lapply(.SD, sum),
by=.(State, year, eventType),
.SDcols=c("Fatalities","Injuries","Dmg")]

# dplyr
df %>% group_by(State, year, eventType) %>%
summarise_each(funs(sum), -PropExp, -CropExp, -Dmg.1)

两者都会导致:

   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

当然,您仍然可以在基础 R 中执行此操作:

aggregate(cbind(Fatalities, Injuries, Dmg) ~ State + year + eventType, data = df, sum)

关于r - 如何使用 dplyr 根据列 id 合并行数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32152372/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com