计算多列,忽略NA

时间:2018-11-21 13:43:03

标签: r multiple-columns

我有一个数据集,我想计算的值,该值(大于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 > 0时我只想+1。

我觉得这是一个简单的问题,但我无法以简洁的方式解决。对于较大的数据集,使用循环的答案将是可取的,但本质上不必一定是函数/ for循环。

1 个答案:

答案 0 :(得分:1)

正如@Sotos在评论中所说,您只能使用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