r - 按值过滤数据集并用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
编辑:我想用条件过滤值并将它们替换为另一个数据集中的值。因此,这个问题与建议重复的问题不同。
解决方案
你不想过滤。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
。
推荐阅读
- python - -bash: pip: command not found, but with `python3 -m pip --version` 显示最新的 pip 版本
- python - Pandas - 如何在组中删除 nan 行,但前提是有多行
- asp.net - Visual Studio - Web 应用程序运行缓慢
- javascript - 鼠标离开未正确触发
- asp.net-mvc - MVC and areas of razor pages in same project .net core
- opengl-es - OpenGL ES 3.2 无法识别几何着色器中的 gl_in
- c# - 使用 c# interop 将文本添加到 powerpoint 幻灯片上的第二个形状
- react-native - React Native fecth data from firestore then dispatch not working-Dispatch empty array
- python - 合并两个 1 列数据框并交替合并元素
- pine-script - 为什么我的(仅限多头)策略也开设空头交易?