根据其他几个变量的值创建新变量

时间:2017-06-26 23:34:59

标签: r

所以我有一个包含多个变量的数据集,我想用它来创建一个新变量。我已经看到使用ifelse语句的其他类似问题,但由于新变量基于32个其他变量,因此这将非常不足。变量使用1,2,3或NA的值进行编码,如果32个变量中的2个或更多变量值为1,则我希望新变量编码为1,否则为2。这是我一直试图做的一个小例子。

df <- data.frame(id = 1:10, v1 = c(1,2,2,2,3,NA,2,2,2,2), v2 = c(2,2,2,2,2,1,2,1,2,2), 
             v3 = c(1,2,2,2,2,3,2,2,2,2), v4 = c(2,2,2,2,2,1,2,2,2,3))

我正在寻找的结果是:

   id v1 v2 v3 v4 new
1   1  1  2  1  2   1
2   2  2  2  2  2   2
3   3  2  2  2  2   2
4   4  2  2  2  2   2
5   5  3  2  2  2   1
6   6 NA  1  3  1   2
7   7  2  2  2  2   2
8   8  2  1  2  2   2
9   9  2  2  2  2   2
10 10  2  2  2  3   2

我也尝试在if else语句中使用rowSums,但是缺少值这对所有观察都不起作用,除非我将NAs重新编码为另一个我想避免做的值,除此之外我觉得这将是一种更有效的方式。

我觉得以前这个问题很可能已得到解答,但我找不到任何相关内容。因此,对以前的答案的帮助或指导将不胜感激。

1 个答案:

答案 0 :(得分:2)

看起来您非常接近获得所需的输出,但您可能在na.rm = TRUE调用中错过了rowSums()参数。这将在rowSums进行计算之前删除所有NAs。

无论如何,使用上面的数据框,我创建了一个新变量,它计算变量中1出现的次数,同时忽略NA值。请注意,我已对数据进行了子集化,以排除id列:

df$count <- rowSums(df[-1] == 1, na.rm = TRUE)

然后我使用ifelse语句创建另一个变量,如果计数为2或更多,则返回1,否则返回2。

df$var <- ifelse(df$count >= 2, 1, 2)

返回的输出:

  id v1 v2 v3 v4 count var
1   1  1  2  1  2     2   1
2   2  2  2  2  2     0   2
3   3  2  2  2  2     0   2
4   4  2  2  2  2     0   2
5   5  3  2  2  2     0   2
6   6 NA  1  3  1     2   1
7   7  2  2  2  2     0   2
8   8  2  1  2  2     1   2
9   9  2  2  2  2     0   2
10 10  2  2  2  3     0   2

UPDATE / EDIT:正如Gregor在评论中所提到的,你也可以将rowSums函数包装在一行代码的ifelse语句中。