代码之家  ›  专栏  ›  技术社区  ›  M.Teich

基于其他列定义的子集计算多个列的度量

  •  1
  • M.Teich  · 技术社区  · 7 年前

    我想计算数据帧中某些列的子集的简单摘要度量,其中这些子集基于同一数据帧的其他列中的信息。我来举例说明:

    colA <- c(NA,2,3,NA,NA,3,9,5,6,1)
    colB <- c(9,3,NA,2,2,4,6,1,9,9)
    colC <- c(NA,NA,5,7,3,9,8,1,2,3)
    colAA <- c(NA,NA,6,NA,NA,NA,1,7,9,4)
    colBB <- c(NA,2,NA,7,8,NA,2,7,9,4)
    colCC <- c(NA,NA,3,7,5,8,9,9,NA,3)
    
    df <- data.frame(colA,colB,colC,colAA,colBB,colCC)
    
    > df
       colA colB colC colAA colBB colCC
    1    NA    9   NA    NA    NA    NA
    2     2    3   NA    NA     2    NA
    3     3   NA    5     6    NA     3
    4    NA    2    7    NA     7     7
    5    NA    2    3    NA     8     5
    6     3    4    9    NA    NA     8
    7     9    6    8     1     2     9
    8     5    1    1     7     7     9
    9     6    9    2     9     9    NA
    10    1    9    3     4     4     3
    

    在这里,colaa应该由cola子集,以便删除cola中包含nas的行:

    > df1 <- subset(df, !is.na(colA))
    > df1
       colA colB colC colAA colBB colCC
    2     2    3   NA    NA     2    NA
    3     3   NA    5     6    NA     3
    6     3    4    9    NA    NA     8
    7     9    6    8     1     2     9
    8     5    1    1     7     7     9
    9     6    9    2     9     9    NA
    10    1    9    3     4     4     3
    

    现在我想计算列长度和列中非NA值的百分比:

    > length(df1$colAA)
    [1] 7
    > (nrow(subset(df1, !is.na(colAA)))/length(df1$colAA))*100
    [1] 71.42857
    

    在理想情况下,输出将写入另一个数据帧,例如:

    cat n perc_n
    1 colAA 7     71
    2 colBB 9     78
    3 colCC 8     88
    

    有没有什么方法可以让所有的专栏都变得更加优雅/高效呢?任何建议都将不胜感激!

    1 回复  |  直到 7 年前
        1
  •  2
  •   Frank    7 年前

    您可以将这两组列传递给 Map 以下内容:

    res = Map(function(x,y) summary(y[!is.na(x)]), df[,1:3], df[, 4:6])
    

    由于帖子被标记为data.table,我还建议将一个表

    data.table::rbindlist(lapply(res, as.list), id="col")
    
    #     col Min. 1st Qu. Median  Mean 3rd Qu. Max. NA's
    # 1: colA    1       4      6 5.400     7.0    9    2
    # 2: colB    2       3      7 5.571     7.5    9    2
    # 3: colC    3       4      7 6.286     8.5    9    1
    

    你可以替换 summary 不管你想用什么函数,它都会返回一个命名向量 as.list + rbindlist 是的。