Сравнение различий в 2 столбцах - PullRequest
0 голосов
/ 12 февраля 2019

Я пытаюсь сравнить 2 столбца, ID и add.Используя ID в качестве ключа, если соответствующие add отличаются, diff должен показать «Да».

df <- data.frame(ID = c("1234", "1234", "7491", "7319", "321", "321"), add = c("ABC", "DEF", "HIJ", "KLM", "WXY", "WXY"))

Ожидаемый результат

    ID add diff
1 1234 ABC  Yes
2 1234 DEF  Yes
3 7491 HIJ   No
4 7319 KLM   No
5  321 WXY   No
6  321 WXY   No

Ответы [ 3 ]

0 голосов
/ 12 февраля 2019

Подход базового R был бы:

df$diff <- sapply(df$ID, function(x) {
  s <- df$add[df$ID == x]
  length(s) != 1 & length(unique(s)) != 1
})

> df
    ID add  diff
1 1234 ABC  TRUE
2 1234 DEF  TRUE
3 7491 HIJ FALSE
4 7319 KLM FALSE
5  321 WXY FALSE
6  321 WXY FALSE

Если вы зависите от Да-Нет, ifelse(df$diff, "Yes", "No").

Или - как @ sindri_baldur предложено - сделайте это быстрее:

unlist(sapply(unique(df$ID), function(x) {
  rows <- df$ID == x
  s <- df$add[rows]
  rep(length(s) != 1 & length(unique(s)) != 1, sum(rows)) 
}))
0 голосов
/ 12 февраля 2019

Вы можете также иметь решение dplyr:

library(dplyr)

df %>% 
  group_by(ID) %>% 
  mutate(diff = ifelse(length(unique(add))>1, "YES", "NO")) # n_distict(add)>1 will also work 
  #mutate(diff = ifelse(n_distinct(add)>1, "YES", "NO"))
# # A tibble: 6 x 3
# # Groups:   ID [4]
# ID    add   diff 
# <fct> <fct> <chr>
# 1 1234  ABC   YES  
# 2 1234  DEF   YES  
# 3 7491  HIJ   NO   
# 4 7319  KLM   NO   
# 5 321   WXY   NO   
# 6 321   WXY   NO
0 голосов
/ 12 февраля 2019

Использование data.table:

setDT(df)
df[, diff := if (uniqueN(add) > 1) "Yes" else "No", by = ID]
df

     ID add diff
1: 1234 ABC  Yes
2: 1234 DEF  Yes
3: 7491 HIJ   No
4: 7319 KLM   No
5:  321 WXY   No
6:  321 WXY   No
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...