R 基于其他几个变量的值创建新变量
所以我有一个数据集,它有多个变量,我想用它们来创建一个新的变量。我见过其他类似这样的问题使用ifelse语句,但这将是非常不够的,因为新变量基于32个其他变量。变量用1、2、3或NA的值进行编码,如果32个变量中有2个或更多的值为1,则我希望新变量编码为1,否则为2。下面是一个我一直在尝试做的小例子R 基于其他几个变量的值创建新变量,r,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),
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))
我还尝试在if-else语句中使用行和,但对于缺少的值,这并不适用于所有观察,除非我将NAs重新编码为另一个我希望避免执行的值,而且我觉得有一种更有效的方法来执行此操作
我觉得这个问题很可能已经被回答过了,但我找不到任何答案。因此,如果您能提供帮助或指导以前的答案,我们将不胜感激 看起来您很快就可以获得所需的输出了,但在调用
rowSums()
时,可能缺少了na.rm=TRUE
参数。这将在rowSums
进行计算之前删除所有NAs
无论如何,使用上面的数据框,我创建了一个新变量,它计算1在变量中出现的次数,同时忽略NA值。请注意,我已将数据子集以排除id
列:
df$count <- rowSums(df[-1] == 1, na.rm = TRUE)
更新/编辑:正如Gregor在评论中提到的那样,您也可以将
行和数
函数包装在ifelse
语句中,用于一行代码。如果您查看?行和数
,您应该会发现您可以设置na.rm=TRUE
以排除缺少的值。第5行似乎不正确。根本没有1,但它被分配了1。我想第5行和第6行被切换了rowsumes(df[-1]==1,na.rm=TRUE)>=2
或者我认为是类似的。ifelse(rowsumes(df[-1]==1,na.rm=TRUE)>=2,1,2)
似乎是正确的。我很想以打字错误结束?似乎OP只需要查看?行和
就可以看到它有na.rm
参数。对不起,第5行和第6行是一个混淆。我只是把它打出来,让大家知道我在看什么。我试图通过将所有变量的值相加来使用rowSums(因此rowSums这很有效。正如我在上面的评论中提到的,我没有意识到可以让rowSums计算条件的出现次数。谢谢。
df$count <- rowSums(df[-1] == 1, na.rm = TRUE)
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