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

如何统一r中具有不同列的多个数据帧之间的列?

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

    我有如下数据帧:

    df1 <- data.frame(a=c(1:5), b=c(6:10), c=c(11:15))
    df2 <- data.frame(a=c(1:5), c=c(11:15))
    

    虽然 df2 缺少列 b ,我希望将两个数据帧中的列合并(填充不存在的列 NA )

    > df2
      a  b  c
    1 1 NA 11
    2 2 NA 12
    3 3 NA 13
    4 4 NA 14
    5 5 NA 15
    

    实际环境中存在多个数据帧。 它们中的大多数都有完整的列,但有些数据帧缺少某些列。

    我想有办法用 names() 从一个特定的数据帧应用到所有数据帧。我更喜欢用 dplyr 在里面 R .

    谢谢你的建议。

    3 回复  |  直到 6 年前
        1
  •  1
  •   Wimpel    6 年前

    使用id绑定行,然后筛选所需的id,然后取消选择id

    library(tidyverse)
    df1 %>% bind_rows( df2, .id = "id" ) %>%
      filter( id == 2 ) %>%
      select( -id )
    
      a  b  c
    1 1 NA 11
    2 2 NA 12
    3 3 NA 13
    4 4 NA 14
    5 5 NA 15
    
        2
  •  1
  •   Maurits Evers    6 年前

    这是一个基r解

    # Create skeleton data.frame based on df1
    # and fill with NAs
    df.new <- df1;
    df.new[] <- NA;
    
    # Fill with entries from df2
    df.new[colnames(df2)] <- df2;
    #  a  b  c
    #1 1 NA 11
    #2 2 NA 12
    #3 3 NA 13
    #4 4 NA 14
    #5 5 NA 15
    
        3
  •  0
  •   MKR    6 年前

    一个选项 base-R 可以通过使用 merge 在数据帧上,然后 intersect 列名上方为:

    df_new <- merge(df1, df2)
    df_new[,!(names(df_new) %in% intersect(names(df1), names(df2)))] <- NA
    df_new
    #   a  c  b
    # 1 1 11 NA
    # 2 2 12 NA
    # 3 3 13 NA
    # 4 4 14 NA
    # 5 5 15 NA
    

    dplyr 基于此的解决方案可以是:

    library(dplyr)
    
    merge(df1, df2) %>% 
      mutate_at(vars(-one_of(intersect(names(df1), names(df2)))),
                                          funs(replace(.,!is.na(.),NA)))
    
    #   a  c  b
    # 1 1 11 NA
    # 2 2 12 NA
    # 3 3 13 NA
    # 4 4 14 NA
    # 5 5 15 NA