我有两个数据框,分别显示一个月和下个月的分析结果。
这是数据的较小版本:
Jan19=data.frame(Group=c(589,630,523,581,689),Count=c(191,84,77,73,57))
Dec18=data.frame(Group=c(589,630,523,478,602),Count=c(100,90,50,6,0))
Jan19
Group Count
1 589 191
2 630 84
3 523 77
4 581 73
5 689 57
Dec18
Group Count
1 589 100
2 630 90
3 523 50
4 478 6
5 602 0
Jan19仅计数> 0。 Dec18是具有上个月结果的数据集。 Dec18每个组的计数> = 0。我一直在为计数= 0引用完整的Dec18数据集,并将它们手动输入到完整的Jan18数据集中。我想摆脱本练习的手动部分,只能够将counts = 0的组附加到Jan19数据集的末尾。
这导致我执行以下代码来执行上述操作:
GData=rbind(Jan19,Dec18)
GData=GData[!duplicated(GData$Group),]
尽管此代码产生了更正尺寸,但它没有选择要删除的正确重复项。在附加的数据集中,Jan19结果> 0被视为重复项并删除。结果是:
Gdata
Group Count
1 589 191
2 630 84
3 523 77
4 581 73
5 689 57
9 478 6
10 602 0
从本质上讲,我希望6显示为0。因此,如果新添加的数据(Dec18)与新的附加组具有重复的组,那么这将导致我进入下面的代码行,我希望设置条件。数据(Jan19),则相应的Count应该= 0。否则,Jan19数据集中的count值应保持不变。
Gdata=ifelse(Dec18$Group %in% Jan19$Group==FALSE, Gdata$Count==0,Jan19$Count)
这会导致错误,我不确定如何修改它以达到期望的结果。任何帮助将不胜感激!
答案 0 :(得分:1)
您的rbind
/重复数据删除方法是一种很好的方法,您只需要将Dec18
上的rbind
数据的Count
列设为0:
Gdata = rbind(Jan19, transform(Dec18, Count = 0))
Gdata[!duplicated(Gdata$Group), ]
# Group Count
# 1 589 191
# 2 630 84
# 3 523 77
# 4 581 73
# 5 689 57
# 9 478 0
# 10 602 0
尽管此代码产生了更正尺寸,但它没有选择要删除的正确重复项。在附加的数据集中,将
Jan19
结果> 0视为重复项并将其删除。结果是:
这是不正确的。 !duplicated()
将保留第一次出现的内容,并删除以后出现的内容。 Jan19
数据没有被删除---我们可以看到Gdata
的前5行恰好是Jan19
的5行。唯一的问题是来自Dec18
的非重复行并非全部为0计数。我们用transform()
来解决这个问题。
还有许多其他方法可以执行此操作,使用merge
函数进行联接,我们只能像数据库建议的那样rbind
对非重复的组进行rbind(Jan19, transform(Dec18, Count = 0)[!Dec18$Group %in% Jan19$Group,])
,并且也有其他人。我们可以使您的ifelse
方法像这样工作:
Gdata = rbind(Jan19, Dec18)
Gdata$Count = ifelse(!Dec18$Group %in% Jan19$Group, 0, Gdata$Count)
# an alternative to ifelse, a little cleaner
Gdata = rbind(Jan19, Dec18)
Gdata$Count[!Gdata$Group %in% Jan19$Group] = 0
使用对您来说最有意义的东西。