объединять кадры данных и сообщать о конфликтах в - PullRequest
0 голосов
/ 03 марта 2020

У меня есть два кадра данных, df1 и df2, и они должны быть объединены (объединены) таким образом, чтобы NA в одном df заменялись значениями во втором df на основе некоторых ключевых столбцов и везде, где обнаружен конфликт сообщается в результирующем дф. Например,

> df1 <- data.frame(c1=c("a","b","c"),c2=c(1,2,3),c3=c("m",NA,"k"),c4=c(1,2,NA),c5=c("z1","z2","z3"))  
> df2 <- data.frame(c1=c("d","b","c"),c2=c(1,2,3),c3=c("m","j","p"),c4=c(1,NA,8),c5=c("k1","k2","k3"))

> df1
---
c1 c2 c3 c4 c5
a  1  m  1  z1
b  2  NA 2  z2
c  3  k  NA z3

> df2
----
c1 c2 c3 c4 c5
d  1  m  1 k1
b  2  j NA k2
c  3  p  8 k3

Я мог бы использовать функцию natural_join из библиотеки rqdatatable, чтобы объединить два кадра данных таким образом, чтобы NA в одном df заменялись значениями из другого df. Но я хотел бы сообщить о конфликте, т. Е. Для значения пары ключей, если сообщается о нескольких конфликтующих значениях, то это должно быть частью моего результирующего кадра данных. В идеале мой результирующий кадр данных должен выглядеть следующим образом:


c1 c2 c3   c4 c5     conflicts_cols
a  1  m    1  k1;z1  c5
b  2  j    2  k2;z2  c5
c  3  k;p  8  k3;z3  c3, c5
d  1  m    1  k1     NA

Может ли кто-нибудь помочь в этом? Спасибо!

1 Ответ

0 голосов
/ 03 марта 2020

Частичный ответ: Вы можете просто связать две таблицы и «squi sh» вместе, сгруппировав их по ключам. Затем нужно найти ячейки с несколькими записями, чего я не смог сделать.

df1 <- data.frame(c1=c("a","b","c"),c2=c(1,2,3),c3=c("m",NA,"k"),c4=c(1,2,NA),c5=c("z1","z2","z3"),stringsAsFactors = F)  
df2 <- data.frame(c1=c("d","b","c"),c2=c(1,2,3),c3=c("m","j","p"),c4=c(1,NA,8),c5=c("k1","k2","k3"),stringsAsFactors = F)  

library(data.table)
setDT(df1)
setDT(df2)

df12<- rbind(df1,df2)
keys <- c('c1','c2')
df_merged <- df12[,lapply(.SD,function(x) list(unique(na.omit(x)))),by=keys]
df_merged
#> c1 c2  c3 c4    c5
#> 1:  a  1   m  1    z1
#> 2:  b  2   j  2 z2,k2
#> 3:  c  3 k,p  8 z3,k3
#> 4:  d  1   m  1    k1 

str(df_merged)
#> Classes 'data.table' and 'data.frame':   4 obs. of  5 variables:
#>  $ c1: chr  "a" "b" "c" "d"
#>  $ c2: num  1 2 3 1
#>  $ c3:List of 4
#>   ..$ : chr "m"
#>   ..$ : chr "j"
#>   ..$ : chr  "k" "p"
#>   ..$ : chr "m"
#>  $ c4:List of 4
#>   ..$ : num 1
#>   ..$ : num 2
#>   ..$ : num 8
#>   ..$ : num 1
#>  $ c5:List of 4
#>   ..$ : chr "z1"
#>   ..$ : chr  "z2" "k2"
#>   ..$ : chr  "z3" "k3"
#>   ..$ : chr "k1"
#>  - attr(*, ".internal.selfref")=<externalptr>

Создано в 2020-03-03 пакетом представ (v0.3.0)

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