我有一个数据集,我想计算次的值,该值(大于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循环。
答案 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