合并用不同的数据帧替换NA-R

时间:2019-02-13 15:43:43

标签: r join merge data-manipulation

给出一个df,其中包含所有可能的行和列,每一行都是一个人,其中X1, X2, X3是该人的ID,而所有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 :(得分:0)

运行代码以获得可重复性之后,您可以尝试下面的代码来将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"))