我有两个这样的数据集:
>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 中的值,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
编辑:我想用条件过滤值并用另一个数据集中的值替换它们。因此,这个问题与建议的重复问题并不相似。
你不想过滤。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
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句