Сравнить два столбца в фрейме данных, и если значение равно False, получить значение другого столбца - PullRequest
1 голос
/ 09 апреля 2019

У меня есть набор данных, в котором я хочу сравнить два столбца.Для каждой строки, где эти столбцы не совпадают, я хочу записать соответствующее значение строки другого значения и записать его в другой фрейм данных.

Входные данные

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

В настоящее время я использую следующий код, но это приводит к пустым строкам, когда значение для столбцов B и C совпадает с Входные данные.Я хочу оставить те из A, для которых B и C не совпадают.

Возможно ли это каким-либо другим способом, поэтому убедитесь, что вышеуказанное условие выполнено?

Код

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

Вывод вышеуказанного кода

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

Ответы [ 2 ]

1 голос
/ 09 апреля 2019

Мы можем просто использовать 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)]
1 голос
/ 09 апреля 2019

Вы можете выбрать 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...