所以我有一个包含多个变量的数据集,我想用它来创建一个新变量。我已经看到使用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重新编码为另一个我想避免做的值,除此之外我觉得这将是一种更有效的方式。
我觉得以前这个问题很可能已得到解答,但我找不到任何相关内容。因此,对以前的答案的帮助或指导将不胜感激。
答案 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
语句中。