根据条件R将数据帧的元素添加到另一个数据帧

时间:2019-03-14 19:10:40

标签: r duplicates

我有两个数据框,分别显示一个月和下个月的分析结果。

这是数据的较小版本:

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)

这会导致错误,我不确定如何修改它以达到期望的结果。任何帮助将不胜感激!

1 个答案:

答案 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

使用对您来说最有意义的东西。