如何计算所有NA并删除该行

时间:2017-06-07 19:22:07

标签: r

我有这样的数据

    df<-structure(list(best2 = c(8972.7, 1944, 2022.7, 13001.7, NA, 3228.6, 
NA, 186.4, 100, 2655.9), best3 = c(2634.4, 1181.3, 505.2, 2802.4, 
NA, 1707.6, NA, 186.4, 100, 1219), best4 = c(3079.3, 1512.9, 
NA, 2804.5, NA, 1597.6, NA, 186.4, 100, 1558.2), best5 = c(8972.7, 
1944, NA, 13001.7, NA, 3228.6, NA, 186.4, 100, 2655.9), best6 = c(2634.4, 
1181.3, NA, 2802.4, NA, 1707.6, NA, 186.4, 100, 1219), best7 = c(3079.3, 
1512.9, NA, 2804.5, NA, 1597.6, NA, 186.4, 100, 1558.2), best8 = c(8972.7, 
1944, NA, 13001.7, NA, 3228.6, NA, 186.4, 100, 2655.9), best9 = c(2634.4, 
1181.3, NA, 2802.4, NA, 1707.6, NA, 186.4, 100, 1219)), .Names = c("best2", 
"best3", "best4", "best5", "best6", "best7", "best8", "best9"
), row.names = c(NA, -10L), class = "data.frame")

我想立刻做所有这些事情

所有单元格为空或NA

的1计数行数

回答:2

具有所有单元格的常量值的2计数行

回答:2

前半空单元格的3个计数行

回答:0

具有后半空单元的4个计数行

回答:1

1 个答案:

答案 0 :(得分:3)

我们可以使用apply函数迭代data.frame的行。然后,我们在逻辑向量上使用rowSums

rowSums(all_logicals <- apply(df, 1, function(r){
    n <- length(r)
    nc2 <- n / 2
    nc2_plus1 <- nc2 + 1
    c('allNA' = all(is.na(r)),
    'allconstant' = (length(unique(r)) == 1 & !all(is.na(r))),
    'firsthalf' = all(is.na(r[1:nc2])) & !all(is.na(r[nc2_plus1:n])),
    'secondhalf' = all(is.na(r[nc2_plus1:n])) & !all(is.na(r[1:nc2])))
}))

  allNA allconstant   firsthalf  secondhalf 
      2           2           0           1 

查看apply传递给rowSums的结果可能会有所帮助:

all_logicals

             [,1]  [,2]  [,3]  [,4]  [,5]  [,6]  [,7]  [,8]  [,9] [,10]
allNA       FALSE FALSE FALSE FALSE  TRUE FALSE  TRUE FALSE FALSE FALSE
allconstant FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE  TRUE FALSE
firsthalf   FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
secondhalf  FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE

编辑 - 使用结果删除行

我们可以使用all_logicals来查找我们要删除的行索引:

remove_rows <- unique(unlist(apply(all_logicals, 1, which)))
(df_sub <- df[-remove_rows,])

     best2  best3  best4   best5  best6  best7   best8  best9
1   8972.7 2634.4 3079.3  8972.7 2634.4 3079.3  8972.7 2634.4
2   1944.0 1181.3 1512.9  1944.0 1181.3 1512.9  1944.0 1181.3
4  13001.7 2802.4 2804.5 13001.7 2802.4 2804.5 13001.7 2802.4
6   3228.6 1707.6 1597.6  3228.6 1707.6 1597.6  3228.6 1707.6
10  2655.9 1219.0 1558.2  2655.9 1219.0 1558.2  2655.9 1219.0