如何使用带有条件的rowSums返回二进制值?

时间:2018-10-15 18:01:46

标签: r

说我有一个数据框,其中有一列用于汇总数据。如果a,b或c列中的任何值都不为零,则在新列中返回二进制0或1的最有效方法是什么? rowSums总体而言还不错,但是如果有任何区别,我还需要一个简单的指标。

tt <- data.frame(a=c(0,-5,0,0), b=c(0,5,10,0), c=c(-5,0,0,0))
tt[, ncol(tt)+1] <- rowSums(tt)

这将产生:

> tt
   a  b  c V4
1  0  0 -5 -5
2 -5  5  0  0
3  0 10 10 20
4  0  0  0  0

第四列是前三列中数据的简单总和。如果任何值与前三列中设置的条件不同,如何添加第五列以返回1/0二进制值?

例如,如果a,b或c中的任何一个都不为0,有没有简单的方法返回1?

3 个答案:

答案 0 :(得分:3)

as.numeric(rowSums(tt != 0) > 0)
# [1] 1 1 1 0

tt != 0给我们一个逻辑矩阵,告诉我们tt中哪里存在不等于零的值。

每行的总和大于零(rowSums(tt != 0) > 0)时,我们知道该行中至少有一个值不为零。

然后,我们将结果转换为数字(as.numeric(.)),并得到了二进制矢量结果。

答案 1 :(得分:3)

我们可以使用Reduce

+(Reduce(`|`, lapply(tt, `!=`, 0)))
#[1] 1 1 1 0

答案 2 :(得分:1)

一个人也可以使用旧的apply循环:

+apply(tt != 0, 1, any)
#[1] 1 1 1 0

自变量tt != 0是一个逻辑矩阵,其中的条目说明该值是否不同于零。然后,将带有边距apply()的{​​{1}}用于按行操作,以检查条目1是否为any。前缀true将逻辑输出转换为数字0或1。它是+的简写形式。