【问题标题】:merge replacing NA with different dataframes - R合并用不同的数据框替换NA - R
【发布时间】:2019-02-13 15:43:43
【问题描述】:

给定一个包含所有可能行和列的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)]

【问题讨论】:

  • 您是否想让 a、b、c 以某种方式合并并看起来像 df ?
  • 没错!但我只是从一个开始。

标签: r join merge data-manipulation


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2016-03-01
    • 1970-01-01
    • 2017-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-28
    • 2018-09-07
    相关资源
    最近更新 更多