Двойное сопоставление двух столбцов в кадре данных - PullRequest
0 голосов
/ 02 июня 2018
library(data.table)
data <- setDT(data.frame(name=c(NA, "bob1", "bob", "jack", "bob1", "bob"), ID=c(1,1,4,3,2,1)))

     name   ID 
1:    NA     1    
2:    bob1   1    
3:    bob    4   
4:    jack   3
5:    bob1   2
6:    bob    1

Критерии соответствия (одновременно):

  • Если разные имена имеют одинаковый идентификатор, измените имена на уникальное имя

  • Если разные идентификаторы имеют одинаковые имена, замените идентификаторы на уникальные идентификаторы

Желаемый результат:

     name   ID 
1:    bob    1    
2:    bob    1    
3:    bob    1   
4:    jack   3
5:    bob    1
6:    bob    1

или

     name   ID 
1:    bob1   1    
2:    bob1   1    
3:    bob1   1   
4:    jack   3
5:    bob1   1
6:    bob1   1

Ответы [ 2 ]

0 голосов
/ 03 июня 2018

Один из вариантов - использовать mapply и order.data.table не делал ничего особенного, поэтому я предпочел просто использовать data.frame.

data <- data.frame(name=c(NA, "bob1", "bob", "jack", "bob1", "bob"), 
                   ID=c(1,1,4,3,2,1), stringsAsFactors =  FALSE)

# First order on ID
data[order(data$ID),]

as.data.frame(t(mapply(function(x,y){
  data[which(!is.na(data$name) & ((!is.na(y) & y==data$name) | x == data$ID))[1],]

}, data$ID, data$name)))

#   name ID
# 1 bob1  1
# 2 bob1  1
# 3 bob1  1
# 4 bob1  1
# 5 jack  3
# 6 bob1  1
0 голосов
/ 03 июня 2018

Ваша проблема не очень хорошо определена, вот 2 решения, которые удовлетворяют вашим критериям, но ни одно из них не выглядит как ваш желаемый результат:

library(data.table)

data <- setDT(data.frame(name=c(NA, "bob1", "bob", "jack", "bob1", "bob"), ID=c(1,1,4,3,2,1)))    
data <- na.omit(data) # remove NAs
data$ID <- data$ID[match(data$name,data$name)] # harmonize ids
data$name <- data$name[match(data$ID,data$ID)] # harmonize names
data
#    name ID
# 1: bob1  1
# 2:  bob  4
# 3: jack  3
# 4: bob1  1
# 5:  bob  4


data <- setDT(data.frame(name=c(NA, "bob1", "bob", "jack", "bob1", "bob"), ID=c(1,1,4,3,2,1)))
data <- na.omit(data) # remove NAs
data$name <- data$name[match(data$ID,data$ID)] # harmonize names
data$ID <- data$ID[match(data$name,data$name)] # harmonize ids
data
#    name ID
# 1: bob1  1
# 2:  bob  4
# 3: jack  3
# 4: bob1  1
# 5: bob1  1
...