首页 > 解决方案 > 按值过滤数据集并用R中其他数据集中的值替换

问题描述

我有两个这样的数据集:

>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

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

最终输出应如下所示:

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

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

标签: rdataframesubset

解决方案


你不想过滤。filter是一个操作,它返回一个数据集,其中行可能已被删除。

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

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,则不会从 中删除相应的 id data1


推荐阅读