如何更新和替换部分旧数据

时间:2016-01-08 02:55:02

标签: r

我想合并df OldData和NewData。 在这种情况下,2015年11月和2015年12月均出现在df中。 由于NewData是最准确的更新,我想使用df NewData中的值更新2015年11月和2015年12月的值,当然还要添加2016年1月和2016年2月的记录。

有人可以帮忙吗?

OldData
      Month Value
1  Jan-2015     3
2  Feb-2015    76
3  Mar-2015    31
4  Apr-2015    45
5  May-2015    99
6  Jun-2015    95
7  Jul-2015    18
8  Aug-2015    97
9  Sep-2015    61
10 Oct-2015     7
11 Nov-2015    42
12 Dec-2015    32

NewData
      Month Value
1  Nov-2015    88
2  Dec-2015    45
3  Jan-2016    32
4  Feb-2016    11

这是我想要的输出:

JoinData
      Month Value
1  Jan-2015     3
2  Feb-2015    76
3  Mar-2015    31
4  Apr-2015    45
5  May-2015    99
6  Jun-2015    95
7  Jul-2015    18
8  Aug-2015    97
9  Sep-2015    61
10 Oct-2015     7
11 Nov-2015    88
12 Dec-2015    45
13 Jan-2016    32
14 Feb-2016    11

感谢@akrun,问题解决了,以下代码顺利运行!!

  

rbindlist(list(OldData,NewData))[!duplicated(Month,fromLast = TRUE)]

更新:现在,让我们稍微升级一下我们的问题。 假设我们的OldData和NewData有另一个名为“Type”的列。 我们这次如何合并/更新它?

> OldData Month Type Value 1 2015-01 A 3 2 2015-02 A 76 3 2015-03 A 31 4 2015-04 A 45 5 2015-05 A 99 6 2015-06 A 95 7 2015-07 A 18 8 2015-08 A 97 9 2015-09 A 61 10 2015-10 A 7 11 2015-11 B 42 12 2015-12 C 32 13 2015-12 D 77

> NewData Month Type Value 1 2015-11 A 88 2 2015-12 C 45 3 2015-12 D 22 4 2016-01 A 32 5 2016-02 A 11

JoinData将假设更新NewData ass中的所有值:

> JoinData Month Type Value 1 2015-01 A 3 2 2015-02 A 76 3 2015-03 A 31 4 2015-04 A 45 5 2015-05 A 99 6 2015-06 A 95 7 2015-07 A 18 8 2015-08 A 97 9 2015-09 A 61 10 2015-10 A 7 11 2015-11 B 42 12 2015-11 A 88 (originally not included, added from the NewData) 12 2015-12 C 45 (Updated the value by NewData) 13 2015-12 D 22 (Updated the value by NewData) 14 2016-01 A 32 (newly added from NewData) 15 2016-02 A 11 (newly added from NewData)

感谢@akrun:我在这里也得到了第二个问题的解决方案。 感谢大家的帮助! 这是答案:

d1< - merge(OldData,NewData,by = c(“Month”,“Type”),all = TRUE); d2< - transform(d1,Value.x = ifelse(!is.na( Value.y),Value.y,Value.x))[ - 4]; d2 [!duplicated(d2 [1:2],fromLast = TRUE),]

1 个答案:

答案 0 :(得分:1)

这是一个使用> df[,1] [1] NA NA NA NA NA NA NA NA [9] NA NA NA NA NA NA NA NA [17] NA NA -12.56643 2.90788 -15.80776 10.35763 18.22261 -8.33948 [25] -11.92777 3.35641 -9.13571 -27.46489 -14.18712 -3.75335 3.60028 -0.64753 [33] 1.07798 12.67291 8.83168 2.20233 11.13526 8.75306 > df[,2] [1] NA NA NA NA NA NA NA 4.59821 [9] 1.80505 0.88652 1.05448 -7.39130 -0.46957 -5.85455 7.66825 -3.12985 [17] -6.58715 -9.43875 NA NA NA NA NA NA [25] NA NA NA NA NA NA NA NA [33] NA NA NA NA NA NA 的选项(与评论中提到的@thelatemail类似的方法)

data.table

或者

library(data.table)
rbindlist(list(OldData, NewData))[!duplicated(Month, fromLast=TRUE)]