как объединить два столбца набора данных в один столбец другого набора данных - PullRequest
0 голосов
/ 27 февраля 2019

У меня есть два набора данных следующим образом

full.name - это столбец, а первое полное имя - это первое слово full.name, а country в df1 неверно, поэтому я хочу сопоставить df1(full.name и first of full name) со столбцом (именем) df2, если любой из двух столбцов df1 совпадает со столбцом df2, то в соответствующем ему должны быть выведены скорректированные значения страны и, если full.name and первое из полного имениdf1 не совпадает с именем df2, тогда он должен напечатать значение full.name and первое из полного имени и NA в значении имени и скорректированной страны

df1:

full.name    first of full name  country
karachi east  karachi            pakistan
phu my        phu                england
phu my        phu                india
delhi         delhi              china
west australia west              england
west australia west              australia
abu dhabai     abu               xyz
south africa   south             africa

и

df2:

name            corrected.country
karachi         pakistan 
phu my          england
delhi           India
west australia  australia
abu             dubai

, и я хочу, чтобы мои выходные данные были равны

full.name    first of full name  country     name          corrected country
karachi east  karachi            pakistan    karachi        pakistan 
phu my        phu                england     phu my         england
phu my        phu                india       phu my         england
delhi         delhi              china       delhi          India
west australia west              england     west australia australia
west australia west              australia   west australia australia
abu dhabai     abu               xyz         abu            dubai
south africa   south             africa      NA              NA

Я хочу сопоставить full.name и first of full name из df1, чтобы соответствоватьимя df2, если какой-либо из столбцов df1 совпадает с df2 (col-name), тогда в выходных данных я хочу исправить столбец страны со столбцом имени, если любой из столбца df1 соответствует столбцу имени df2, либо full.name, либо first of full name

я знаю, я сделал это немного сложным, но я действительно хочу решить эту проблему, пожалуйста, help

Ответы [ 2 ]

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

Я начинаю с воссоздания ваших наборов данных.Вам не нужно выполнять эту часть, потому что у вас уже есть свои собственные данные, но я включил их здесь для тех, кто хочет воспроизвести решение.

df1 <- data.frame(stringsAsFactors=FALSE,
            full.name = c("karachi east", "phu my", "phu my", "delhi",
                          "west australia", "west australia", "abu dhabai"),
   first.of.full.name = c("karachi", "phu", "phu", "delhi", "west", "west",
                          "abu"),
              country = c("pakistan", "england", "india", "china", "england",
                          "australia", "xyz"))
df2 <- data.frame(stringsAsFactors=FALSE,
                name = c("karachi", "phu my", "delhi", "west australia", "abu"),
   corrected.country = c("pakistan", "england", "India", "australia", "dubai")
)

Теперь загрузите пакет dplyr,Вы можете использовать inner_join, чтобы сопоставить каждую переменную «key» (т.е. full.name и first.of.full.name) с df2, а затем с помощью union () объединить два набора данных.

library(dplyr)

df3 <- union(inner_join(df1, df2, by = c("first.of.full.name" = "name")) , 
      inner_join(df1, df2, by = c("full.name" = "name")))

df3
#>        full.name first.of.full.name   country corrected.country
#> 1   karachi east            karachi  pakistan          pakistan
#> 2          delhi              delhi     china             India
#> 3     abu dhabai                abu       xyz             dubai
#> 4         phu my                phu   england           england
#> 5         phu my                phu     india           england
#> 6 west australia               west   england         australia
#> 7 west australia               west australia         australia

Если разбить это на отдельные этапы, это будет

library(dplyr)

df3 <- inner_join(df1, df2, by = c("first.of.full.name" = "name"))
df3
#>      full.name first.of.full.name  country corrected.country
#> 1 karachi east            karachi pakistan          pakistan
#> 2        delhi              delhi    china             India
#> 3   abu dhabai                abu      xyz             dubai

df4 <- inner_join(df1, df2, by = c("full.name" = "name"))
df4
#>        full.name first.of.full.name   country corrected.country
#> 1         phu my                phu   england           england
#> 2         phu my                phu     india           england
#> 3          delhi              delhi     china             India
#> 4 west australia               west   england         australia
#> 5 west australia               west australia         australia

df5 <- union(df3, df4)
df5
#>        full.name first.of.full.name   country corrected.country
#> 1   karachi east            karachi  pakistan          pakistan
#> 2          delhi              delhi     china             India
#> 3     abu dhabai                abu       xyz             dubai
#> 4         phu my                phu   england           england
#> 5         phu my                phu     india           england
#> 6 west australia               west   england         australia
#> 7 west australia               west australia         australia

Создано в 2019-02-27 пакетом представлением (v0.2.0).

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

Ну, это должно работать до тех пор, пока в вашем фрейме данных нет дубликатов

library(dplyr)

mutate(inner_join(df1, df2, by = c("full.name"= "name")), name = full.name) %>%
  dplyr::union(., mutate(inner_join(df1, df2, by = c("first.of.full.name" = "name")), name = first.of.full.name)) %>% 
       select(1,2,3,5,4) #just ordering the columns


       full.name first.of.full.name   country           name corrected.country
1         phu my                phu   england         phu my           england
2         phu my                phu     india         phu my           england
3          delhi              delhi     china          delhi             India
4 west australia               west   england west australia         australia
5 west australia               west australia west australia         australia
6   karachi east            karachi  pakistan        karachi          pakistan
7     abu dhabai                abu       xyz            abu             dubai

Когда вы просто объедините два data.frames объединяемых двух столбца, они станут одним, поэтому мне пришлось искать обходной путьдля вашей name -колонки, все еще находящейся в результате.

Остерегайтесь имен столбцов при воспроизведении моего кода.Но они должны быть одинаковыми в R.

ОБНОВЛЕНИЕ:

Чтобы включить имена, не входящие в df2:

> df1_2
       full.name first.of.full.name   country
1   karachi east            karachi  pakistan
2         phu my                phu   england
3         phu my                phu     india
4          delhi              delhi     china
5 west australia               west   england
6 west australia               west australia
7     abu dhabai                abu       xyz
8      Stuttgart          Stuttgart   germany

bind_rows(df3, df1_2[rowSums(sapply(1:2, function(x) df1_2[,x] %in% df2$name)) == 0,])

full.name first.of.full.name   country           name corrected.country
1         phu my                phu   england         phu my           england
2         phu my                phu     india         phu my           england
3          delhi              delhi     china          delhi             India
4 west australia               west   england west australia         australia
5 west australia               west australia west australia         australia
6   karachi east            karachi  pakistan        karachi          pakistan
7     abu dhabai                abu       xyz            abu             dubai
8      Stuttgart          Stuttgart   germany           <NA>              <NA>

df1_2 - это ваш df1 с новой строкой иdf3 - результат сверху.

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