【问题标题】:r count cells with missing values across each row [duplicate]r计算每行缺少值的单元格[重复]
【发布时间】:2016-11-21 16:43:16
【问题描述】:

我有一个如下所示的数据框

    Id         Date         Col1       Col2     Col3        Col4
    30         2012-03-31              A42.2    20.46        NA  
    36         1996-11-15   NA                  V73          55
    96         2010-02-07   X48        Z16      13
    40         2010-03-18   AD14                20.12        36
    69         2012-02-21              22.45                     
    11         2013-07-03   81         V017                  TCG11         
    22         2001-06-01                       67
    83         2005-03-16   80.45      V22.15   46.52        X29.11 
    92         2012-02-12   
    34         2014-03-10   82.12      N72.22   V45.44

我正在尝试计算每行中NA空单元格 的数量,最终预期输出如下

    Id         Date         Col1       Col2     Col3        Col4       MissCount
    30         2012-03-31              A42.2    20.46        NA        2
    36         1996-11-15   NA                  V73          55        2
    96         2010-02-07   X48        Z16      13                     1
    40         2010-03-18   AD14                20.12        36        1
    69         2012-02-21              22.45                           3
    11         2013-07-03   81         V017                  TCG11     1    
    22         2001-06-01                       67                     3
    83         2005-03-16   80.45      V22.15   46.52        X29.11    0
    92         2012-02-12                                              4   
    34         2014-03-10   82.12      N72.22   V45.44                 1

最后一列MissCount 将存储NAs 的数量或每行的空单元格。非常感谢任何帮助。

【问题讨论】:

  • 可能像rowSums(is.na(df) | df == "") 这样的东西会做
  • 它可以在输入阶段通过 read.table("filename",sep=",",na.strings=c("",,NA),stringsAsFactors=FALSE) 解决,这将只产生 NA 值,您可以使用 @DavidArenburg 解决方案来计算所有 NA

标签: r count missing-data


【解决方案1】:

单线

rowSums(is.na(df) | df == "")

@DavidArenburg 在他的评论中给出的绝对是要走的路,假设您不介意检查数据框中的每一列。如果您真的只想检查Col1Col4,那么使用apply 函数可能更有意义。

apply(df, 1, function(x) {
                sum(is.na(x[c("Col1", "Col2", "Col3", "Col4")])) +
                sum(x[c("Col1", "Col2", "Col3", "Col4")] == "", na.rm=TRUE)
             })

编辑:缩短的代码

apply(df[c("Col1", "Col2", "Col3", "Col4")], 1, function(x) {
                    sum(is.na(x)) +
                    sum(x == "", na.rm=TRUE)
                 })

或者如果数据列与示例数据完全相同:

apply(df[3:6], 1, function(x) {
                        sum(is.na(x)) +
                        sum(x == "", na.rm=TRUE)
                     })

【讨论】:

  • 我认为您可以将代码缩短为apply(df[c("Col1", "Col2", "Col3", "Col4")], 1, function(x),然后在函数内调用x,对吗?或者,如果数据的结构如示例中所示,则只需 apply(df[3:6], 1, function(x)
  • @LeoP。在这种情况下,请随意进行编辑。我只是想指出必须在 somewhere 指定列(尽管您的建议可能比我的不那么难看 ^ ^)。
【解决方案2】:

应该这样做。

yourframe$MissCount = rowSums(is.na(yourframe) | yourframe == "" | yourframe == " "))

【讨论】:

  • 我想你忘了检查空字符串。
  • @burton030,谢谢。
【解决方案3】:

您可以使用库 purrr 中的 by_row:

library(purrr)

#sample data frame
x <- data.frame(A1=c(1,NA,3,NA),
                A2=c("A","B"," ","C"),
                A3=c(" "," ",NA,"t"))

在这里你对每一行应用一个函数,你可以根据你的条件编辑它。你可以使用任何你想要的功能。 在以下示例中,我使用 sum(...) 计算每行中的空或 NA 条目:

by_row(x, function(y) sum(y==" "| (is.na(y))),
       .to="MissCount",
       .collate = "cols"
       )

你会得到:

# A tibble: 4 x 4
     A1     A2     A3 MissCount
  <dbl> <fctr> <fctr>     <int>
1     1      A                1
2    NA      B                2
3     3            NA         2
4    NA      C      t         1

【讨论】:

    【解决方案4】:

    我们可以使用

    Reduce(`+`, lapply(df, function(x) is.na(x)|!nzchar(as.character(x))))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-12-29
      • 1970-01-01
      • 1970-01-01
      • 2019-03-11
      • 1970-01-01
      • 2021-01-28
      • 2019-05-09
      相关资源
      最近更新 更多