【问题标题】:Counting over multiple columns, ignoring NA计算多列,忽略 NA
【发布时间】:2018-11-21 13:43:03
【问题描述】:

我有一个数据集,我想计算一个值(大于 0)出现在一系列列中的 次 次数,以 x_times 表示。

例子:

.    x1   x2   x3   x4  x_times
1    NA    0    0    0   0
2     0   NA    0    0   0
3     0    0   NA    1   1
4     1    0    1   NA   2
5    NA    0    0    0   0
6     0   NA    0    0   0
7     0    0   NA    0   0
8     1    2    4   NA   3
9    NA    0    0    0   0
10    0   NA    1    5   2
11    0    0   NA    0   0
12    0    1    0   NA   1

我摆弄了 ifelse 语句,但 4 列有点过分。我可以,但必须有一个更简单的方法。

count <- 0
with(df5, ifelse(df$x1 > 0, count+1, ifelse(df$x1 == 0 , count+0 ,
    ifelse(df$x2 > 0, count+1, ifelse(df$x2 == 0, count+0,
     ifelse(df$x3 > 0, count+1, ifelse(df$x3 == 0, count+0, 
       ifelse(df$x4 > 0, count+1, ifelse(df$x4 == 0, count+0, 0 
 )))))))))

附带问题,我可以在这样的 ifelse 语句中 +1 吗?这几行 ifelse 代码不起作用,它会更改值而不是添加它们。

我尝试修改这个:apply(cbind(df$x1, df$x2, df$x3,df$x4), 1, function(x) ifelse(all(is.na(x)), NA, nrow(x, na.rm=T))),但无济于事。

dplyr::count() 返回有关整数的错误

rowSums 将这些值相加,x &gt; 0 时我只想 +1。

我觉得这是一个简单的问题,但我无法以简洁的方式弄清楚。对于较大的数据集,带有循环的答案将受到赞赏,但它本身不一定是函数/for循环。

【问题讨论】:

  • 试试rowSums(df &gt; 0, na.rm = TRUE)
  • 我需要从列的子集中调用它们。 rowSums(cbind(df$x1 , df$x2 , df$x3 , df5x4) &gt; 0, na.rm = T ) 就像一个魅力。谢谢

标签: r multiple-columns


【解决方案1】:

正如@Sotos 在 cmets 中所说,您可以只使用 rowSums。

 dat <- 
   data.frame(x1 = c(rep(c(NA, 0, 0, 1), 2), NA, 0, 0, 0),
              x2 = c(0, NA, 0, 0, 0, NA, 0, 2, 0, NA, 0, 1),
              x3 = c(0, 0, NA, 1, 0, 0, NA, 4, 0, 1, NA, 0),
              x4 = c(0, 0, 1, NA, 0, 0, 0, NA, 0, 5, 0, NA))

library(tidyverse)
> dat %>% mutate(x_times = rowSums(.>0, na.rm = TRUE))

   x1 x2 x3 x4 x_times
1  NA  0  0  0       0
2   0 NA  0  0       0
3   0  0 NA  1       1
4   1  0  1 NA       2
5  NA  0  0  0       0
6   0 NA  0  0       0
7   0  0 NA  0       0
8   1  2  4 NA       3
9  NA  0  0  0       0
10  0 NA  1  5       2
11  0  0 NA  0       0
12  0  1  0 NA       1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-28
    • 2019-08-19
    • 1970-01-01
    • 1970-01-01
    • 2017-10-25
    相关资源
    最近更新 更多