Переберите 2 кадра данных, чтобы идентифицировать одинаковые столбцы для объединений - PullRequest
0 голосов
/ 14 января 2019

У меня есть 2 воспроизводимых кадра данных здесь. Я пытаюсь определить, какой столбец содержит значения, похожие на другой столбец. Я надеюсь, что мой код будет случайным образом выбирать 1 значение из каждого столбца и проходить через каждый столбец в df2.

df1 <- data.frame(fruit=c("Apple", "Orange", "Pear"), location = c("Japan", "China", "Nigeria"), price = c(32,53,12))
df2 <- data.frame(grocery = c("Durian", "Apple", "Watermelon"), place=c("Korea", "Japan", "Malaysia"), invoice = c("XD1", "XD2", "XD3"))

df1$source <- "DF1"
df2$source <- "DF2"

df1

   fruit location price source
1  Apple    Japan    32    DF1
2 Orange    China    53    DF1
3   Pear  Nigeria    12    DF1

df2  
     grocery    place invoice source
1     Durian    Korea     XD1    DF2
2      Apple    Japan     XD2    DF2
3 Watermelon Malaysia     XD3    DF2

Это вывод, который я надеюсь получить в новом фрейме данных с именем df3.

df3
         grocery    place    invoice source
    1     fruit    location     NA    DF1

Исходный столбец позволит пользователю определить, откуда берутся соответствующие столбцы (фрукты / место). Имя столбца df3 = имена столбцов из df2, тогда как значения в строке1 = имена столбцов из df1.

Столбец "Бакалея" сопоставляется с фруктами, поскольку существует совпадающее значение, т. Е. "Яблоко" и "Япония" можно найти в столбцах места и местоположения соответственно.

Спасибо!

Ответы [ 2 ]

0 голосов
/ 14 января 2019

Возможно, это не самое оптимальное решение, но можно использовать двойной sapply (поскольку для каждого столбца df2 мы хотим найти аналогичные столбцы в df1)

sapply(names(df2), function(x) {
     temp <- sapply(names(df1), function(y) 
         if(any(match(df2[[x]], df1[[y]], nomatch = FALSE))) y else NA)
     ifelse(all(is.na(temp)), NA, temp[which.max(!is.na(temp))])
   }
)

# grocery     place     invoice     source 
# "fruit" "location"         NA         NA 

Это даст вам все столбцы в df2, которые match как минимум в одном значении со значениями в df1. Затем вы можете вручную изменить столбец source, поскольку, если есть строка, вы знаете, что она из df1.

0 голосов
/ 14 января 2019

Внес изменения. Это грязно, но работает.

#create data frame of column combinations
col_combos <- expand.grid(names(df1), names(df2))

#identify like columns
like_cols <- na.omit(col_combos[as.logical(apply(col_combos, 1, function(x) intersect(df1[, x[1] ],df2[, x[2] ]) > 1 )), ])

#match like columns
rbind(names(df2), as.character(like_cols$Var1)[match(names(df2), as.character(like_cols$Var2))])

     [,1]      [,2]       [,3]      [,4]    
[1,] "grocery" "place"    "invoice" "source"
[2,] "fruit"   "location" NA        NA   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...