通过 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
我有 运行 代码来保存对象 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