r - R ifelse 基于满足两个标准的观察
问题描述
是的,非常简单的问题即将让我陷入困境,因为我知道有一种合乎逻辑的方法。我有两个数据帧,并希望在第一个数据帧 0/1 中创建一个新列,具体取决于第二个数据帧中的任何行是否包含来自第一个数据帧的 col1/col2 对。
数据
df.ex1 <- data.frame('name'=c('sally', 'joe', 'ben', 'nick'), 'grade1'=c('A', 'B', 'F', 'A'))
df.ex2 <- data.frame('name'=c('jed', 'ben', 'sally', 'nick'), 'grade1'=c('A', 'F', 'A', 'C'))
> df.ex1
name grade1
1 sally A
2 joe B
3 ben F
4 nick A
> df.ex2
name grade1
1 jed A
2 ben F
3 sally A
4 nick C
#Expected result:
name grade1 bin
1 sally A 1
2 joe B 0
3 ben F 1
4 nick A 0
显而易见的方法是检查第二个 df 中是否存在名称等级对:
df.ex1$bin <- ifelse(df.ex1[,1:2] %in% df.ex2[,1:2], 1, 0)
但这不起作用。为什么不?什么是正确的方法?实际上,得出正确方法的正确思维过程是什么?
请注意,这显然行不通:
df.ex1$bin <- ifelse(df.ex1[,1] %in% df.ex2[,1] & df.ex1[,2] %in% df.ex2[,2], 1, 0)
解决方案
您可能首先在寻找基于联接的东西:
df.ex2$bin <- 1
res <- merge(df.ex1,df.ex2,all.x = TRUE)
res$bin <- ifelse(is.na(res$bin),0,1)
> res
name grade1 bin
1 ben F 1
2 joe B 0
3 nick A 0
4 sally A 1
使用dplyr或data.table等其他流行的包将有许多等效的方法来做到这一点。
推荐阅读
- azure-devops - 在扩展模板中设置名称在 azure yaml 管道中不起作用
- timer - ATSAML21 硬件定时器
- ssl - Rancher - 对 ingress.local 有效
- java - 如何在 Java 中捕获 AuthenticationFailedException 错误?
- excel - 接下来没有错误用户表单 Excel VBA 错误与 Else-If 语句
- java - 如何使用 Spring Security + Angular 登录/验证
- javascript - 更新 Firestore 数据时间戳为空
- java - 如何使用 Powermockito 模拟构建器?
- php - 根据值在 Symfony 中设置多个实体
- html - CSS:调用具有相同属性的任何元素