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

У меня есть 2 воспроизводимых кадра данных здесь. Я пытаюсь определить, какой столбец содержит значения, похожие на другой столбец. Я надеюсь, что мой код будет проходить в каждой строке и проходить через каждый столбец в 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"), 
                  name = c("Mark", "John", "Tammy"), 
                  favourite.food = c("Apple", "Wings", "Cakes"), 
                  invoice = c("XD1", "XD2", "XD3"))

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

t1 <- data.frame(lapply(df, type.convert), stringsAsFactors=FALSE)
t1 <- data.frame(t(t1))
t1 <- cbind(newColName = rownames(t1), t1)
rownames(t1) <- 1:nrow(t1)
colnames(t1) <- c("Columns from df1", "Columns from df2")

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

df2
     grocery    place  name favourite.food invoice
1     Durian    Korea  Mark          Apple     XD1
2      Apple    Japan  John          Wings     XD2
3 Watermelon Malaysia Tammy          Cakes     XD3

t1 #(OUTPUT FROM CODE ABOVE)

  Columns from df1    Columns from df2
1            fruit          grocery
2         location            place
3            price             <NA>

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

  Columns from df1    Columns from df2
1            fruit          grocery, favourite.food
2         location            place
3            price             <NA>

Обратите внимание, что столбцы "Grocery" и "favourite.food" оба соответствуют столбцу "fruit", тогда как мой код возвращает только один столбец.

1 Ответ

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

Мы можем изменить код, чтобы вместо этого возвращать все совпадения, и обернуть их в одну строку, используя toString

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

vec

#         fruit                location      price 
#"grocery, favourite.food"      "place"        NA 

Чтобы преобразовать его в датафрейм, мы можем сделать

data.frame(columns_from_df1 = names(vec), columns_from_df2 = vec, row.names = NULL)

#  columns_from_df1        columns_from_df2
#1            fruit grocery, favourite.food
#2         location                   place
#3            price                    <NA>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...