我有两个这样的数据集:
>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
编辑: 我想用条件过滤值,然后用另一个数据集中的值替换它们。因此,此问题与建议重复的问题不同。
答案 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。