如何使用循环和 ifelse 语句创建新变量
How to create new variables using loop and ifelse statement
我有很多同名但后缀不同的变量。例如,var1、var2、var3、var4、var5、var6……等等。这些变量中的每一个都有一个随机序列 0、1 和 2。使用这些变量,我试图创建一个名为 testvariable
的新变量。如果任何已经存在的变量有 1,我将设置 testvariable
为 1。如果它们有 0 或 2,我将分配 0。
是否有一个简单的循环 and/or ifelse 语句可以用来创建这个变量?我的真实数据比这复杂得多,所以我不想复制和粘贴每个单独的变量和值。
编辑:这是给 R 的。
我会为此使用 mget
。 mget
以列表形式给出变量。然后您可以使用 sapply
检查列表中的每个元素,并使用 any
合并结果。最后我利用了你对 0 和 1 的编码,但你也可以使用 if
语句。
var1 <- c(0,0,1,2)
var2 <- c(2,2,2,2)
var3 <- c(0,2,0,2)
var4 <- c(0,2,2,2)
any(sapply(mget(paste0("var", 1:4)), function(x) 1 %in% x)) * 1
#> [1] 1
any(sapply(mget(paste0("var", 2:4)), function(x) 1 %in% x)) * 1
#> [1] 0
如果我没理解错的话,如果变量 var1、var2、.. 等中的任何一个的值为 1,则测试变量必须为 1,否则为 0,则执行:
样本 df:
var1 var2 var3 var4 var5
1 1 1 1 1 1
2 2 2 2 2 2
3 0 1 0 1 0
4 0 0 0 0 1
5 1 1 2 1 2
6 2 2 2 2 2
7 2 2 1 2 2
8 1 1 2 1 1
9 0 0 0 0 0
代码:
df$testvariable <- ifelse(rowSums(df[, grepl("var", names(df))] == 1) > 0, 1, 0)
输出:
var1 var2 var3 var4 var5 testvariable
1 1 1 1 1 1 1
2 2 2 2 2 2 0
3 0 1 0 1 0 1
4 0 0 0 0 1 1
5 1 1 2 1 2 1
6 2 2 2 2 2 0
7 2 2 1 2 2 1
8 1 1 2 1 1 1
9 0 0 0 0 0 0
我有很多同名但后缀不同的变量。例如,var1、var2、var3、var4、var5、var6……等等。这些变量中的每一个都有一个随机序列 0、1 和 2。使用这些变量,我试图创建一个名为 testvariable
的新变量。如果任何已经存在的变量有 1,我将设置 testvariable
为 1。如果它们有 0 或 2,我将分配 0。
是否有一个简单的循环 and/or ifelse 语句可以用来创建这个变量?我的真实数据比这复杂得多,所以我不想复制和粘贴每个单独的变量和值。
编辑:这是给 R 的。
我会为此使用 mget
。 mget
以列表形式给出变量。然后您可以使用 sapply
检查列表中的每个元素,并使用 any
合并结果。最后我利用了你对 0 和 1 的编码,但你也可以使用 if
语句。
var1 <- c(0,0,1,2)
var2 <- c(2,2,2,2)
var3 <- c(0,2,0,2)
var4 <- c(0,2,2,2)
any(sapply(mget(paste0("var", 1:4)), function(x) 1 %in% x)) * 1
#> [1] 1
any(sapply(mget(paste0("var", 2:4)), function(x) 1 %in% x)) * 1
#> [1] 0
如果我没理解错的话,如果变量 var1、var2、.. 等中的任何一个的值为 1,则测试变量必须为 1,否则为 0,则执行:
样本 df:
var1 var2 var3 var4 var5
1 1 1 1 1 1
2 2 2 2 2 2
3 0 1 0 1 0
4 0 0 0 0 1
5 1 1 2 1 2
6 2 2 2 2 2
7 2 2 1 2 2
8 1 1 2 1 1
9 0 0 0 0 0
代码:
df$testvariable <- ifelse(rowSums(df[, grepl("var", names(df))] == 1) > 0, 1, 0)
输出:
var1 var2 var3 var4 var5 testvariable
1 1 1 1 1 1 1
2 2 2 2 2 2 0
3 0 1 0 1 0 1
4 0 0 0 0 1 1
5 1 1 2 1 2 1
6 2 2 2 2 2 0
7 2 2 1 2 2 1
8 1 1 2 1 1 1
9 0 0 0 0 0 0