按值过滤数据集并用R中其他数据集中的值替换

时间:2018-12-17 12:20:00

标签: r dataframe subset

我有两个这样的数据集:

>data1
id  l_eng   l_ups
1   6385    239
2   680     0
3   3165    0
4   17941   440
5   135     25
6   151     96
7   102188  84
8   440     65
9   6613    408

>data2
id  l_ups
1   237
2   549 
3   100
4   444
5   28
6   101
7   229
8   92
9   47

我想从l_ups==0的data1中过滤出值,并使用id作为r中的查找值将它们替换为data2中的值。

最终输出应如下所示:

id  l_eng   l_ups
1   6385    239
2   680     549
3   3165    100
4   17941   440
5   135     25
6   151     96
7   102188  84
8   440     65
9   6613    408

我尝试了以下代码,但是没有运气

if(data1[,3]==0)
{
filter(data1, last_90_uploads == 0) %>%
merge(data_2, by.x = c("id", "l_ups"),
    by.y = c("id", "l_ups")) %>%
select(-l_ups)
}

我无法通过if语句来获取此信息,因为它将仅取一个值作为逻辑条件。但是,如果我有多个值作为逻辑语句该怎么办? 像这样:

>if(data1[,3]==0)
TRUE TRUE

编辑: 我想用条件过滤值,然后用另一个数据集中的值替换它们。因此,此问题与建议重复的问题不同。

1 个答案:

答案 0 :(得分:1)

您不想过滤。 filter是一种操作,它返回可能已删除行的数据集。

您正在寻找“条件更新”操作(就数据库而言)。您已经在使用dplyr,因此请尝试加入连接而不是match:

left_join(data1, data2, by='id') %>%
  mutate(l_ups = ifelse(!is.na(l_ups.x) || l_ups.x == 0, l_ups.y, l_ups.x))

通过使用联接操作而不是@markus建议使用直接子集比较,可以确保仅比较具有相同ID的值。如果您的一个数据帧碰巧错过一行,则直接子集比较将失败。 通过使用 left_join 而不是inner_join,还可以确保如果data2缺少ID,则不会从data1中删除相应的ID。