提前致谢。使用以下虚拟数据,我可以在数据框a1$r
中创建指标变量a1
,其中a1
中的两列与a2
中的两列相匹配。就这样:
a1 <- data.frame(a = 1:5, b=letters[1:5])
a2 <- data.frame(a = c(1,6,3,4), b=letters[1:4])
a1$r <- ifelse(a1$a %in% a2$a & a1$b %in% a2$b, 1,0)
a1
然而,当我尝试在我的实际数据上复制它时,代码可以工作,但它会返回“错误”的答案。我很想定义错误,但我似乎无法弄清楚它到底在做什么。我尝试了几种方法,包括match
,但无济于事。我对我的数据有一些固有的感觉 - 但我无法弄清楚是什么。所有变量都编码为数字。
任何建议将不胜感激。再次感谢。
答案 0 :(得分:3)
您的陷阱可能如下:
a1 = data.frame(a = 1:3, b = letters[1:3])
a2 = data.frame(a = c(2,1,3), b = letters[1:3])
a1$r = ifelse(a1$a %in% a2$a & a1$b %in% a2$b, 1,0)
a1
# a b r
#1 1 a 1
#2 2 b 1
#3 3 c 1
匹配的所有内容(因为每个条件都是单独评估的,而且两个不是逐行评估的),但我猜你只期望最后一个匹配。
你想要的是一个连接操作,我会使用data.table
:
library(data.table)
# convert to `data.table` in place
setDT(a1)
setDT(a2)
# set the keys for the join
setkey(a1, a, b)
# fill r initially with 0's, then set to 1 only those that will match the join
a1[, r := 0][a2, r := 1]
a1
# a b r
#1: 1 a 0
#2: 2 b 0
#3: 3 c 1
答案 1 :(得分:1)
更简单(但不一定是可扩展的)方法是使用duplicated
和rbind
。
使用@ eddi的样本数据:
a1 = data.frame(a = 1:3, b = letters[1:3])
a2 = data.frame(a = c(2,1,3), b = letters[1:3])
duplicated(rbind(a1, a2), fromLast=TRUE)[sequence(nrow(a1))]
# [1] FALSE FALSE TRUE
在as.numeric
中包含该内容以获取1和0而不是TRUE
和FALSE
s。
如果您希望“a1”或“a2”中有重复项,则无法正常工作。
想到的另一个粗略的想法是:
do.call(paste, a1) %in% do.call(paste, a2)
# [1] FALSE FALSE TRUE
答案 2 :(得分:1)
类似@eddi回答的解决方案,但使用基数R:
a1 = data.frame(a = 1:3, b = letters[1:3])
a2 = data.frame(a = c(2,1,3), b = letters[1:3])
#Do a join using function merge on one of the column:
A = merge(a1,a2,by="b") #Here I chose to join on column b but you can as well join on a.
A
# b a.x a.y
#1 a 1 2
#2 b 2 1
#3 c 3 3
#Check if the other column match:
a1$r = ifelse(A[,2]==A[,3], 1, 0) #Note here the use of == and not %in% as we're comparing pairwise.
a1
# a b r
#1 1 a 0
#2 2 b 0
#3 3 c 1
修改:如果您的a1包含不在a2中的值,则需要在all
中使用参数merge
:
a1 = data.frame(a = c(1:3,3), b = letters[1:4])
a2 = data.frame(a = c(2,1,3), b = letters[1:3])
A = merge(a1,a2,by="b",all=TRUE)
A
# b a.x a.y
#1 a 1 2
#2 b 2 1
#3 c 3 3
#4 d 3 NA
a1$r = ifelse(A[,2]==A[,3], 1, 0)
a1$r[is.na(a1$r)] = 0
修改强>
A = merge(a1,a2,by="b",all=TRUE)
A$r = ifelse(A[,2]==A[,3],1,0)
A$r[is.na(A$r)] = 0
a1 = merge(a1,A[,c("b","r")],by="b")
适用于所有案例数据。