У меня есть решение для data.table, использующее другую технику.
library(data.table)
df2 <- complete(df,x , y, fill=list(z=NA))
df2 <- setDT(df2)
df2[!is.na(z),.(x = y, y = x, z = z)][df2, on = .(x,y)][is.na(z),z:=i.z][,i.z := NULL][]
x y z
1: A A NA
2: A B 1
3: A C 0
4: B A 1
5: B B NA
6: B C -1
7: C A 0
8: C B -1
9: C C NA
что он делает: он объединяет df2 с
df2[!is.na(z),.(x = y, y = x, z = z)]
x y z
1: C A 0
2: A B 1
3: B C -1
, который является значением некорреляции, но с переключенными x и y.В результате получается
x y z i.z
1: A A NA NA
2: A B 1 NA
3: A C NA 0
4: B A NA 1
5: B B NA NA
6: B C -1 NA
7: C A 0 NA
8: C B NA -1
9: C C NA NA
. Затем я заполняю z значениями iz и подавляю столбец iz.Другой синтаксис, использующий merge
:
merge(df2[!is.na(z),.(x = y, y = x, z = z)],df2,all.y = T,by = c("x","y"))[,z:=ifelse(is.na(z.x),z.y,z.x)][,c("z.x","z.y"):=NULL][]
та же идея с dplyr :
library(dplyr)
right_join(df2 %>%
filter(!is.na(z)) %>%
rename(x = y, y = x),
df2, by = c("x","y")) %>%
mutate(z = ifelse(is.na(z.x),z.y,z.x)) %>%
select(y,x,z)
y x z
1 A A NA
2 B A 1
3 C A 0
4 A B 1
5 B B NA
6 C B -1
7 A C 0
8 B C -1
9 C C NA