我可以在%数据上运行%代码而不是真实数据

时间:2014-07-11 18:38:50

标签: r

提前致谢。使用以下虚拟数据,我可以在数据框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,但无济于事。我对我的数据有一些固有的感觉 - 但我无法弄清楚是什么。所有变量都编码为数字。

任何建议将不胜感激。再次感谢。

3 个答案:

答案 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)

更简单(但不一定是可扩展的)方法是使用duplicatedrbind

使用@ 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而不是TRUEFALSE 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")

适用于所有案例数据。