Как определить частичные дубликаты строк в R - PullRequest
0 голосов
/ 13 февраля 2019

Я хотел бы определить «частичные» совпадения строк в кадре данных.В частности, я хочу создать новый столбец со значением 1, если конкретная строка в кадре данных имеет повторяющуюся строку где-то еще в кадре данных на основе соответствия между подмножеством столбцов.Дополнительная сложность заключается в том, что один из столбцов в кадре данных является числовым, и я хочу сопоставить, если абсолютные значения совпадают.Вот пример данных, за которыми следует пример моего желаемого результата.

name<-c("Richard Nixon", "Bill Clinton", "George Bush", "Richard Nixon")
state<-c("California", "Indiana", "Florida", "California")
num<-c("-258", "123", "42", "258")
date<-c("day 2", "day 15", "day 3","day 45")
(df<-as.data.frame(cbind(name,state,num, date)))
           name      state  num   date
1 Richard Nixon California -258  day 2
2  Bill Clinton    Indiana  123 day 15
3   George Bush    Florida   42  day 3
4 Richard Nixon California  258 day 45

Я надеюсь получить следующий кадр данных:

           name      state  num   date newcol
1 Richard Nixon California -258  day 2 1
2  Bill Clinton    Indiana  123 day 15 0
3   George Bush    Florida   42  day 3 0
4 Richard Nixon California  258 day 45 1

Обратите внимание, что строки 1 и 2 совпадаютвдоль столбцов name и state, а их абсолютные значения совпадают в столбце num, в результате чего 1 в добавленном столбце newcol для обеих этих строк, в то время как остальные строки не имеют такого соответствия и, следовательно,оцениваются в 0.

Я пробовал следующее, но безрезультатно:

df$num<-as.numeric(df$num)
which(duplicated(df[c('name', 'state',abs('num'))]),)

Error in abs("num") : non-numeric argument to mathematical function

Конечно, это не работает из-за abs()

1 Ответ

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

Вы можете использовать

df$absnum = abs(as.numeric(as.character(df$num)))
df$newcol = duplicated(df[,c('name','state', 'absnum')]) | 
  duplicated(df[,c('name','state', 'absnum')], fromLast = T)

#            name      state  num   date absnum newcol
# 1 Richard Nixon California -258  day 2    258   TRUE
# 2  Bill Clinton    Indiana  123 day 15    123  FALSE
# 3   George Bush    Florida   42  day 3     42  FALSE
# 4 Richard Nixon California  258 day 45    258   TRUE

Если вам действительно нужно, чтобы newcol было 1 или 0, то вы можете преобразовать его в целое число, используя as.integer.Но в большинстве случаев лучше всего хранить логические флаги как логические типы.

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