代码之家  ›  专栏  ›  技术社区  ›  Chris

合并用不同的数据帧替换na-r

  •  0
  • Chris  · 技术社区  · 6 年前

    给定一个 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)]
    
    0 回复  |  直到 6 年前
        1
  •  0
  •   tigerloveslobsters    6 年前

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