【问题标题】:Update a dataframe using new information for some rows, but keeping all the old information also使用某些行的新信息更新数据框,但同时保留所有旧信息
【发布时间】:2021-07-14 17:22:57
【问题描述】:

我有几个用于创建地图的数据框。这些数据框每天更新,但只有部分行更新。因此,每个新数据帧仅包含原始数据帧的行子集。 第一个df包含空间信息

head(boxes)
  Name       lon      lat
1   B1 -1.308810 51.76481
2  B10 -1.309306 51.76457
3 B100 -1.308591 51.76488
4 B101 -1.308725 51.76464
5 B102 -1.308454 51.76439
6 B103 -1.308270 51.76412

下一个 df 包含一些额外的信息

head(boxes0604)
  Name Section       lon      lat State.code Clutch.size
1   B1       b -1.308810 51.76481          0           0    
2  B10       b -1.309306 51.76457          1           0    
3 B100       b -1.308591 51.76488          0           0    
4 B101       b -1.308725 51.76464          0           0    
5 B102       b -1.308454 51.76439          0           0    
6 B103       b -1.308270 51.76412          0           0    

我可以很容易地使用dplyrleft_join 组合这些并绘制我的第一张地图

现在假设我在下一个数据帧 boxes0804 中仅获得了一些关于信息子集的新信息

head(boxes0804)
  Name Section         State.code Clutch.size
1 B108       b            0           4    
2 B211       b            1           6    
3 B219       b            4           12    
4 B237       b            4           8    
5 B287       b            4           7    
6 B291       b            4           11

可以看到这个df不包含空间信息,只包含boxes0604中包含的部分行

为了将这个新信息绘制在来自boxes0604 的旧信息之上,我想做的是结合这些数据集以仅导入新信息并保留所有旧信息。当我尝试加入他们时,我会丢失新 df 的所有信息。可能是我错误地使用了join 函数。

提前致谢

【问题讨论】:

  • 你试过其他的加入方法吗?喜欢full_join 来自dplyr
  • 都试过了,似乎都没有得到我想要的结果。它通常最终只保留所有旧信息而不添加新信息
  • 如果你确定数据帧的顺序(当然还有行号),我建议你使用merged <- cbind(old,new),如果你没有设置顺序,那么cbind他们全部跨度>

标签: r dataframe join dplyr


【解决方案1】:

如果我正确理解了这个问题,您希望将boxes0804 合并到您现有的数据中,但仅限于名称同时出现在现有数据和boxes0804 中的行。我的建议是使用 data.table 仅合并这些行,如下所示:

boxes <- setDT(boxes)
boxes0804 <- setDT(boxes0804)
# First keep the rows without a match
boxes_nomatch <- boxes[! Name %in% boxes0804$Name]
# Now merge on the new rows, where there is a match
boxes_match <- merge(boxes[Name %in% boxes0804$Name], boxes0804, by = "Name", all.x = TRUE)
boxes_updated <- rbind(boxes_nomatch, boxes_match)

如果没有可重复的示例,要做到这一点有点困难:How to make a great R reproducible example,但我认为这就是你想要的。

【讨论】:

  • 是的,很抱歉用我的手机写这个。我会试试的
猜你喜欢
  • 2019-04-08
  • 1970-01-01
  • 2016-05-16
  • 1970-01-01
  • 1970-01-01
  • 2015-07-13
  • 2013-01-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多