gpt4 book ai didi

r - 聚合正在删除数据行

转载 作者:行者123 更新时间:2023-12-02 09:06:42 24 4
gpt4 key购买 nike

我是 R 新手,我已经尝试了很多方法来解决这个问题,如果有人可以帮助我,我将非常感激!这是我的问题:

我必须处理按年份、类型(从该国家进口或导出)和产品尺寸(以公斤为单位)分隔的产品时间序列,如下所示:

dat<-data.frame(NAME=c("P1","P1","P2","P2","P1","P2","P1","P1") , YEAR =c(1991,1991,1991,1991,1992,1992,1993,1993), TYPE=c("IMPORT","EXPORT","IMPORT","EXPORT","IMPORT","EXPORT","IMPORT","EXPORT"), VALUE=c(300,200,170,150,150,120,90,100))
dat
# NAME YEAR TYPE VALUE
#1 P1 1991 IMPORT 300
#2 P1 1991 EXPORT 200
#3 P2 1991 IMPORT 170
#4 P2 1991 EXPORT 150
#5 P1 1992 IMPORT 150
#6 P2 1992 EXPORT 120
#7 P1 1993 IMPORT 90
#8 P1 1993 EXPORT 100

所以,我要做的就是获取数据中所有年份和产品的产品进口和导出之间的差异。它应该看起来像这样

solution<-data.frame(NAME=c("P1","P2","P1","P2","P1"),Year=c(1991,1991,1992,1992,1993),VALUE=c(100,20,150,-120,-10))
solution

# NAME Year VALUE
#1 P1 1991 100
#2 P2 1991 20
#3 P1 1992 150
#4 P2 1992 -120
#5 P1 1993 -10

我使用聚合来解决这个问题,但是当我这样做时,代码删除了 1992 年的产品 p1 和 p2,因为那一年没有 P1 的导出或 p2 的进口。有谁知道怎么解决吗?

这是我的代码的一部分:

agg<-sort(data, f= ~ year + name)
agg<-aggregate(size~year + name, data=data, FUN=diff)

最佳答案

这是tidyverse的实现方式

library(tidyr)
library(dplyr)
spread(dat, TYPE, VALUE) %>%
mutate(IMPORT = ifelse(is.na(IMPORT), 0, IMPORT),
EXPORT = ifelse(is.na(EXPORT), 0, EXPORT),
diff = IMPORT - EXPORT)

产生

  NAME YEAR EXPORT IMPORT diff
1 P1 1991 200 300 100
2 P1 1992 0 150 150
3 P1 1993 100 90 -10
4 P2 1991 150 170 20
5 P2 1992 120 0 -120

更新

我完全忘记了 spread 中的 fill 参数,多亏了注释,代码可以简化为

spread(dat, TYPE, VALUE, fill=0) %>%
mutate(diff = IMPORT - EXPORT)

关于r - 聚合正在删除数据行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57467653/

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