首页 > 解决方案 > 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)

标签: rif-statement

解决方案


您可能首先在寻找基于联接的东西:

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

使用dplyrdata.table等其他流行的包将有许多等效的方法来做到这一点。


推荐阅读