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

R:从数据帧列表中选择列,而有些列在少数数据帧中不存在。

r
  •  1
  • maycca  · 技术社区  · 6 年前

    我有一个数据帧列表,它只有几个共同的列。我有一个我想要保留的列向量。但是,有些数据帧正好有这些列,有些则缺少一些列。

    如果每个数据帧都包含相同的列,我只需使用 subset(df, select = c("column", "names")) 选择我感兴趣的列。但是,如何只选择存在的列呢?

    我有一个虚拟的例子,但我想用 map lapply 函数在列表中,因为我的实际数据中有许多数据帧。

    我的虚拟例子:

    df1<- data.frame(a  = seq(0,5),
                     b  = seq(5,10),
                     cc = seq(10,15))
    
    df2<- data.frame(a  = seq(0,5),
                     b  = seq(5,10),
                     d = seq(10,15))
    
    
    ls <-list(df1, df2)
    
    # select columns,  "cc" column is missing from df2
    keep<-c("b", "cc")
    

    如何修改此函数以仅选择数据帧中存在的列?

    lapply(ls, function(x) subset(x, select = keep) )
    

    列号不均匀的预期输出:

    [[1]]
       b cc
    1  5 10
    2  6 11
    3  7 12
    4  8 13
    5  9 14
    6 10 15
    
    [[2]]
       b 
    1  5 
    2  6 
    3  7 
    4  8 
    5  9 
    6 10 
    
    1 回复  |  直到 6 年前
        1
  •  2
  •   MRau    6 年前

    你可以使用 intersect 功能:

    > intersect(c("a", "b", "c"), c("a", "b"))
    [1] "a" "b"
    

    也就是说,像这样修改您的函数:

    > lapply(ls, function(x) subset(x, select = intersect(keep, colnames(x))))
    [[1]]
       b cc
    1  5 10
    2  6 11
    3  7 12
    4  8 13
    5  9 14
    6 10 15
    
    [[2]]
       b
    1  5
    2  6
    3  7
    4  8
    5  9
    6 10