代码之家  ›  专栏  ›  技术社区  ›  A. Handler

有没有办法将数据帧的列与完整列名向量相匹配?

  •  2
  • A. Handler  · 技术社区  · 2 年前

    我有一个列名向量(其中262个)和一个具有相同列名的数据帧,但缺少几列(因此我有250列,而不是262列)。

    有没有办法将数据帧的列设置为包含完整列名集的向量,对于没有数据的名称,生成NAs列?

    column_names <- c("col1","col2","col3","col4","col5","col6","col7")
    
    df1 <- data.frame(c(20,30,10,20,45),c(1,10,2,45,2),c(9,10,22,11,12),c(87,7,7,7,14),c(89,90,99,12,1))
    names(df1) <-c("col1","col2","col3","col5","col6")
    
    # col1 col2 col3 col5 col6
    # 20   1    9    87   89
    # 30   10   10   7    90
    # 10   2    22   7    99
    # 20   45   11   7    12
    # 45   2    12   14   1
    

    我想生成一个类似于:

    df2 <- data.frame(c(20,30,10,20,45),c(1,10,2,45,2),c(9,10,22,11,12),c("NA","NA","NA","NA","NA"),c(87,7,7,7,14),c(89,90,99,12,1),c("NA","NA","NA","NA","NA"))
    names(df2) <-column_names
    
    # col1 col2 col3 col4 col5 col6 col7
    # 20   1    9    NA   87   89   NA
    # 30   10   10   NA   7    90   NA
    # 10   2    22   NA   7    99   NA
    # 20   45   11   NA   7    12   NA
    # 45   2    12   NA   14   1    NA
    
    
    3 回复  |  直到 2 年前
        1
  •  4
  •   norie    2 年前

    你可以用 setdiff 获取缺少的列名,然后添加新列。

    column_names <- c("col1","col2","col3","col4","col5","col6","col7")
    
    df <- data.frame(col1 = c(20,30,10,20,45),col2=c(1,10,2,45,2),col4=c(9,10,22,11,12),col5=c(87,7,7,7,14),col6=c(89,90,99,12,1))serdi(colnames(df),column_names)
    
    missing_cols <- setdiff(column_names,colnames(df))
    df[missing_cols] <- NA
    
    df <- df[column_names]
    
    df
    
      col1 col2 col3 col4 col5 col6 col7
    1   20    1   NA    9   87   89   NA
    2   30   10   NA   10    7   90   NA
    3   10    2   NA   22    7   99   NA
    4   20   45   NA   11    7   12   NA
    5   45    2   NA   12   14    1.  NA
    
        2
  •  3
  •   Darren Tsai    2 年前

    cbind(df1, lapply(
      setdiff(column_names, names(df1)),
      \(x) setNames(data.frame(NA), x)
    ))[column_names]
    
    #   col1 col2 col3 col4 col5 col6 col7
    # 1   20    1    9   NA   87   89   NA
    # 2   30   10   10   NA    7   90   NA
    # 3   10    2   22   NA    7   99   NA
    # 4   20   45   11   NA    7   12   NA
    # 5   45    2   12   NA   14    1   NA
    
        3
  •  2
  •   Zheyuan Li    2 年前

    我提出了这个矢量化的解决方案:

    ## original number of columns in `df1`
    nc <- length(df1)
    ## augment `df1` with an extra column of NA
    df1$na <- NA
    ## map all columns not in `df1` to this extra NA column
    df2 <- df1[match(column_names, names(df1)[1:nc], nomatch = nc + 1)]
    ## fix names to desired ones
    names(df2) <- column_names
    ## see the result
    df2
    #  col1 col2 col3 col4 col5 col6 col7
    #1   20    1    9   NA   87   89   NA
    #2   30   10   10   NA    7   90   NA
    #3   10    2   22   NA    7   99   NA
    #4   20   45   11   NA    7   12   NA
    #5   45    2   12   NA   14    1   NA
    

    在这里,我处理数据。框架作为命名列表并使用 [] 用于所有索引操作。同样的想法也适用于命名列表和命名向量。