объединить с заменой NA на разные кадры данных - R - PullRequest
0 голосов
/ 13 февраля 2019

Учитывая df со всеми возможными строками и столбцами, каждая строка - это человек, где X1, X2, X3 - это идентификатор человека, а все Y columns - это данные этого человека:

> df
   X1 X2 X3 Y4 Y5 Y6 Y7 Y8 Y9 Y10
1   1  e 80 NA NA NA NA NA NA  NA
2   4  w 47 NA NA NA NA NA NA  NA
3   5  f 54 NA NA NA NA NA NA  NA
4   6  c 94 NA NA NA NA NA NA  NA
5   6  s 54 NA NA NA NA NA NA  NA
6   7  r 22 NA NA NA NA NA NA  NA
7   9  f 78 NA NA NA NA NA NA  NA
8   9  p 26 NA NA NA NA NA NA  NA
9   9  x 15 NA NA NA NA NA NA  NA
10  9  y 16 NA NA NA NA NA NA  NA

> a
  X1 X2 X3 Y5 Y6
1  6  c 94 48 74
2  5  f 54 25 78
3  1  e 80 27 89
4  9  y 16 37 93
5  9  x 15 14 79

Когда я пытаюсь объединить df и a, я получаю такой результат:

df2 <- merge(df,a, by.x = colnames(df[,1:3]), by.y=colnames(df[,1:3]), all=TRUE)
> df2
   X1 X2 X3 Y4 Y5.x Y6.x Y7 Y8 Y9 Y10 Y5.y Y6.y
1   1  e 80 NA   NA   NA NA NA NA  NA   27   89
2   4  w 47 NA   NA   NA NA NA NA  NA   NA   NA
3   5  f 54 NA   NA   NA NA NA NA  NA   25   78
4   6  c 94 NA   NA   NA NA NA NA  NA   48   74
5   6  s 54 NA   NA   NA NA NA NA  NA   NA   NA
6   7  r 22 NA   NA   NA NA NA NA  NA   NA   NA
7   9  f 78 NA   NA   NA NA NA NA  NA   NA   NA
8   9  p 26 NA   NA   NA NA NA NA  NA   NA   NA
9   9  x 15 NA   NA   NA NA NA NA  NA   14   79
10  9  y 16 NA   NA   NA NA NA NA  NA   37   93

Почему он не заменяет существующий NA и вместо этого создает новые столбцы?

Код для воспроизводимости:

df <- data.frame(matrix(ncol = 10, nrow=0))
substr(colnames(df)[4:10],start=1,stop=1) <- "Y"
xy <- data.frame(X1 = sample(1:9,10, replace = TRUE),
               X2 = sample(letters[1:25],10, replace = TRUE),
               X3 = sample(11:99,10,replace = TRUE),
               Y4 = sample(1:9,10,replace=TRUE),
               Y5 = sample(10:49,10,replace=TRUE),
               Y6 = sample(50:99,10,replace=TRUE),
               Y7 = sample(100:199,10,replace=TRUE),
               Y8 = sample(200:299,10,replace=TRUE),
               Y9 = sample(300:399,10,replace=TRUE),
               Y10 =sample(400:499,10,replace=TRUE))

df <- merge(df,xy[,1:3], by.x = colnames(xy[,1:3]), by.y=colnames(xy[,1:3]), all.y =  TRUE)
a <- xy[1:5,c(1:3,5:6)]
b <- xy[3:7,c(1:3,7:8)]
c <- xy[8:10,c(1:3,9:10)]

1 Ответ

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

После запуска вашего кода для воспроизводимости, вы можете попробовать код ниже, чтобы получить a, b, c, чтобы быть df.Это отвечает на ваш вопрос?

library(tidyverse)

transform_this <- function (data) {
  data1 <- data %>% 
    mutate(x_all = paste(X1,X2,X3,sep = "|")) %>% 
    select(x_all,starts_with("Y")) 
data1
}


transform_this(a) %>% 
  full_join(transform_this(b)) %>% 
  full_join(transform_this(c)) %>% 
  separate(col = x_all,into = c("X1","X2","X3"))
...