通过 for 循环转换多个变量中的元素不起作用

Converting elements in multiple variables by for loop is not working

我有 运行 代码来保存对象 binvar 中的字符和二进制变量的名称

print(binvar)

[1]“x1”“x2”“x3”“x4”
[5]“x5”

我想将它用于原始数据帧 df 中的 select 列,以便 运行 一个 for 循环,我将 yes 和 no 转换为 1 和 0。

for(i in 1:length(binvar)){
  for(j in 1:length(nrow(df))){
    if(df[[binvar[i]]][j]=="Yes"){
      df[[binvar[i]]][j]<-1
    }
    else if(df[[binvar[i]]][j]=="No"){
      df[[binvar[i]]][j]<-0
    }
  }
}

问题在于循环不会遍历 selected 列内的所有元素,而是仅遍历每列的第一个元素。我以为迭代器 j 会遍历所有元素。

我该如何解决这个问题?

我们不需要 R 中的嵌套循环。 == 是元素比较运算符。根据列名向量 ('binvar') 对数据集 ('df') 进行子集化,即 df[binvar]),创建一个逻辑矩阵 (== "Yes") 并将逻辑转换为二进制 ( +) 并将 (<-) 分配回列的子集(假设只有 'Yes'、'No' 和可能的 NA)

df[binvar] <- +(df[binvar] == "Yes")

在 OP 的嵌套循环中,第二个表达式是有问题的,因为 nrow returns 是单个值,而 length 将为 1,因此 1:1 始终1.

for(j in 1:length(nrow(df)))

应该是

for(j in seq_len(nrow(df)))

如果我们想要一个可重现的例子

> data(iris)
> nrow(iris)
[1] 150
> length(nrow(iris))
[1] 1
> 1:length(nrow(iris))
[1] 1