【问题标题】:Value matching by %in%%in% 的值匹配
【发布时间】:2018-12-24 10:50:11
【问题描述】:

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

例如:

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

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

【问题讨论】:

  • 请使用更多数据和精确的预期输出更新您的问题,以获得清晰的可重复示例。
  • 欢迎来到 StackOverflow!请阅读有关how to ask a good question 的信息以及如何提供reproducible example。这将使其他人更容易帮助您。
  • 更新了示例数据。 4 个观察结果,我检查观察结果 3 应该匹配但结果是错误的。
  • 我想通过两个变量查找匹配项。...哪个?也请浏览我给你的链接并制作适当的可重复示例
  • 问题是当我构建一个示例时,它会产生一个 TRUE。但是我的真实数据给出了错误的。它基本上是一样的,所以如果你可以看看我的输出来检测它给出 FALSE 的可能原因。

标签: r


【解决方案1】:

在这种情况下,我认为您可以选择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 的行,在其中我在数据框 2 中找到相同的人(X1)和值(X2)。然后给数据框 1 的 X3 与数据框 2 相同的值并添加(更改)对 dataframe2 的观察。
  • 好的,所以在 dataframe2 中 X1=1 的 X3 的值,X2=A 将更改为 3.05?
  • 让我们说一下示例数据的输出:如果 dataframe1 X1 和 X2 = dataframe X1 和 X2 然后将 dataframe1 X3 更改为 dataframe2 X3 的值。我更新了我的示例数据,这样你就可以运行那个在匹配的地方产生错误的数据。
【解决方案2】:

我仍然无法弄清楚导致不匹配的原因,但我找到了解决方法。

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

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

【讨论】:

    猜你喜欢
    • 2012-07-23
    • 2011-11-22
    • 2023-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多