比较数据框中的两列,如果为False,则捕获另一列的值

时间:2019-04-09 04:04:22

标签: r dataframe

我有一个要比较两列的数据集。对于这些列不匹配的每一行,我想捕获另一个值的对应行值,并将其写入另一个数据帧。

输入数据

data <- structure(list(A = 1:7, B = c(1L, 2L, 1L, 1L, 1L, 9L, 9L), C = c(1L, 
3L, 2L, 1L, 6L, 8L, 1L)), class = "data.frame", row.names = c(NA, 
-7L))

预期产量

  A
1 2
2 3
3 5
4 6
5 7

当前,我正在使用以下代码,但是当{strong>输入数据中的BC列的值匹配时,这将导致空行。我想保留AB不匹配的C

是否可以通过其他方式确保满足上述条件?

代码

ifelse(data$B == data$C, 
      data$A, "")

上述代码的输出

[1] ""  "2" "3" ""  "5" "6" "7"

2 个答案:

答案 0 :(得分:1)

您可以在A处选择B != C个值,然后将其添加到新的数据框中。

data.frame(A = data$A[data$B != data$C])

#  A
#1 2
#2 3
#3 5
#4 6
#5 7

如果您只需要值向量,就可以

data$A[data$B != data$C]
#[1] 2 3 5 6 7

ifelse中,我们用空格(""替换了不满足条件的值,因此输出的长度与data中的行数相同。

答案 1 :(得分:1)

我们可以只使用subset

subset(data, B != C, select = A)
#  A
#2 2
#3 3
#5 5
#6 6
#7 7

或与filter

library(dplyr)
data %>% 
    filter(B != C) %>%
    select(A)

或使用data.table

library(data.table)
setDT(data)[B != C, .(A)]
相关问题