r - 与 df 比较并根据匹配行填充 col
问题描述
我有两个看起来像这样的df,
id1<-c(2,2,2,1,3)
id2<-c(4,4,5,2,3)
OS<-c(1,2,3,4,5)
a <- cbind(OS, id1, id2)
a
i1<-c(2,2,2,4,3)
i2<-c(4,4,5,2,3)
OSi<-c(1,2,3,4,5)
b <- cbind(OSi, i1, i2)
我想创建一个带有“0”的新 col (x),其中 a$OS 和 a$OSi 匹配(即 1->1、2->2),但只有在每个 df 中的后续两个 cols 一致的情况下,和'1'他们没有。我想要的输出是这样的:
id1<-c(2,2,2,1,3)
id2<-c(4,4,5,2,3)
OS<-c(1,2,3,4,5)
x <-c(0,0,0,1,0)
a <- cbind(OS, id1, id2, x)
a
到目前为止,我已经尝试过:
a$x <- case_when(a$OS %in% b$OSi &
a$id1 %in% b$I1 &
b$id2 %in% b$I2 ~ '0') %>%
replace_na('1')
但是,我发现 Case_when 只是看起来满足这里的第一个参数。(即 0/1 的比率根据变量的顺序而变化)。
另外,上面是顶级df。我的实际数据约为 10000 行,b 比 a 长。我可能还想删除不在 a 中但在 b 中的任何行。
我希望这已经足够清楚了。Dplyr 我更喜欢集成到管道中!
干杯!
解决方案
这是否有效:
> id1<-c(2,2,2,1,3)
> id2<-c(4,4,5,2,3)
> OS<-c(1,2,3,4,5)
> a <- data.frame(OS, id1, id2)
>
>
> i1<-c(2,2,2,4,3)
> i2<-c(4,4,5,2,3)
> OSi<-c(1,2,3,4,5)
> b <- data.frame(OSi, i1, i2)
>
>
> transform(a %>% inner_join(b, by = c('OS' = 'OSi')), x = ifelse((id1 == i1) & (id2 == i2), 0, 1)) %>% select(OS, id1, id2, x)
OS id1 id2 x
1 1 2 4 0
2 2 2 4 0
3 3 2 5 0
4 4 1 2 1
5 5 3 3 0
>
我使用了 inner_join,所以我们根据您的第一个条件 a$OS == b$OSi 加入
推荐阅读
- blogger - 如何修复博客中的多个重定向
- python - 我有字典作为熊猫数据框列中的值。我想将键列和值作为列值
- r - 安装包“tinytex”的退出状态非零
- postgresql - 在 PostgreSQL 中使用几个 Temp 变量
- java - Java 方法能否根据方法中的条件返回不同的类型?
- python - 在 python 中编写 Discord 机器人 - 如何让机器人从一组图像中发送随机图像?
- markdown - Mathjax + Markdown + Jekyll,移动设备白色对象覆盖数学文本问题
- ruby-on-rails - 未创建数据库记录,可能是关系问题?
- c++ - 为什么这些指针是相同的,却指向一个对象的不同实例?
- asp.net-core-webapi - 在 ASP NET Core Web API 中进行 OTP 验证后发出 JWT