【问题标题】:Create variable using multiple conditions使用多个条件创建变量
【发布时间】:2016-08-27 19:10:30
【问题描述】:

我想在数据框A中创建变量NewVar,如果满足以下两个条件,则将其设置为1。

  1. Var0== 列名中的数字Var(i),例如Var0=4Var4
  2. 变量 Var(i) 不等于 0:!Var(i)==0

下面是我想要实现的示意图:

A <- read.table(text="  Var0    Var1    Var2    Var3    Var4    NewVar  
          4 0   0   0   1   1   
          4 0   0   0   0   0   
          2 0   1   0   0   1   
          2 0   0   0   0   0   
          1 1   0   0   0   1   
          1 0   0   0   0   0   
          3 0   0   1   0   1   
          3 0   0   0   0   0", header=T)

我一直在尝试使用类似的东西:

A$NewVar <- for (var in names(A[ ,2:5])) {
  ifelse(A$Var0==grep("var", colnames(A)) & A$var==1, 1, 0)
}

访问列索引,但它不起作用。

在 Excel 中,我将使用 match 语句返回变量 Var1-4 中 1 的列索引,并使用 if 语句来测试列索引是否等于 Var0 中的值。如果是,则 NewVar=1,否则为 0。

希望这能让我想要做的事情更清楚。我正在尝试从 Excel 迁移到 R!

【问题讨论】:

  • 您无需进行任何更改,但只是为了将来的问题dput 将是您共享数据的一种更简单的方式
  • 哦,好的,谢谢@Hack-R。
  • 0 和 1 是否真的对应 True 和 False 等逻辑值?
  • 嗨@NathanDay,我不确定他们是否这样做了,但他们没有。

标签: r variables for-loop


【解决方案1】:

这里有两种假设:

  1. 列名如您所说(Var1、Var2 等)。
  2. 您可以只使用相关单元格中的值(0 或 1)。

第一个选项是使用for循环,第二个是使用apply()

A <- read.table(text="  Var0    Var1    Var2    Var3    Var4    NewVar  
          4 0   0   0   1   1   
          4 0   0   0   0   0   
          2 0   1   0   0   1   
          2 0   0   0   0   0   
          1 1   0   0   0   1   
          1 0   0   0   0   0   
          3 0   0   1   0   1   
          3 0   0   0   0   0", header=T)

# Using a for loop...
col_to_match <- paste0("Var", A$Var0)
for(i in seq(col_to_match)) {
   A[i, "NewVar2"] <- A[i, col_to_match[i]]
}

# Using apply()
A$NewVar3 <- apply(A, 1, function(i) {
  col_to_match <- paste0("Var", i["Var0"])
  i[col_to_match]
})

A
#>   Var0 Var1 Var2 Var3 Var4 NewVar NewVar2 NewVar3
#> 1    4    0    0    0    1      1       1       1
#> 2    4    0    0    0    0      0       0       0
#> 3    2    0    1    0    0      1       1       1
#> 4    2    0    0    0    0      0       0       0
#> 5    1    1    0    0    0      1       1       1
#> 6    1    0    0    0    0      0       0       0
#> 7    3    0    0    1    0      1       1       1
#> 8    3    0    0    0    0      0       0       0

只需将“NewVar2”或“NewVar3”更改为“NewVar”(我只是添加了数字来演示)。

如果你真的需要检查值是否!= 0,则将其添加到相关行并添加as.numeric()以从布尔值到0/1。例如,在上面的 for 循环部分:

A[i, "NewVar2"] <- as.numeric(A[i, col_to_match[i]] != 0)

或在apply() 部分:

as.numeric(i[col_to_match] != 0)

【讨论】:

  • 很高兴听到它:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-08
  • 1970-01-01
  • 2020-10-01
  • 1970-01-01
  • 2016-02-28
  • 1970-01-01
相关资源
最近更新 更多