值匹配%in%

时间:2018-12-24 10:50:11

标签: r

我创建了一个循环,其中我遍历了一个数据框,在该数据框中我将值与另一个数据框进行了匹配。 我想通过两个变量查找匹配项。这两个数据框包含相同的变量。

例如:

X1 <- c(4247857)
X2 <- c(4.66)
dataframe1 <- data.frame(X1, X2)

X1 <- c(4247850, 4247888, 4247857, 4020051)
X2 <- c(4.55, 3.66, 4.66, 3.05)
dataframe2 <- data.frame(X1, X2)

tempvar <- dataframe1[1, "X2"]
dataframe1[1,"X2"] %in% dataframe2[dataframe2$X2 == tempvar, "X2"]

这里的结果是:

dataframe1[1,"X2"] %in% dataframe2[dataframe2$X2 == tempvar, "X2"]
TRUE

这是我想要的,但是根据我的真实数据得出的结果是:

 dataframe1[3, "X2"]
 3.05

dataframe2[dataframe2$X2 == tempvar, "X2"]
3.05
3.05
3.05
4.66
3.05
4.66
4.66
3.05
4.66
3.05
4.66

dataframe1[3,"X2"] %in% dataframe2[dataframe2$X2 == tempvar, "X2"]
    FALSE

我在这里得到假的原因可能是什么?

2 个答案:

答案 0 :(得分:0)

在这种情况下,我认为您可以使用merge,这比使用循环快得多,而且效率更高:

# create a flag to see if it works correctly
df1$flag <- 1

# merge the data
df3 <- merge(df, df1[,c('X2','X3','flag')], by = c('X2','X3'), all.x = T)

  X2   X3 X1  X4 flag
1  A 0.10  1 yes   NA
2  B 3.66  2  no   NA
3  B 4.66  1 yes    1
4  C 3.05  1 yes   NA

# now you can do the next step on df3

答案 1 :(得分:0)

我仍然不知道是什么原因导致不匹配,但是我找到了解决方法。

我不再像示例那样检查2个变量,而是现在对每个变量使用semi_join并检查它们是否相同。这使我对所有这样的变量都成立了:

temp <- semi_join(dataframe2, dataframe1[i,], by= "X1") 
temp2 <-semi_join(temp, dataframe1, by= "X2")
if(datafram1[i,"X2"] == unique(temp2$X2))