循环遍历列表

6

我已经遇到了这个问题好几次了,这一次我渴望得到一个有效的解决方案。根本问题是我想用 paste 函数循环遍历变量列表。

dat <- read.csv("some file", header=TRUE)  

list.R <- c("IC","IG","DM","IM","IN","EN","RM")  

for (RO in list.R){
            paste("dat$",RO,"_I", sep="")[
            paste("dat$",RO,"_I", sep="") == 
            "Strongly disagree"] <- 1
            }

我把变量的名称拼在一起,但这给了我一个带引号的字符串。我尝试了以下几种方法,但目前还没有成功:

eval(parse(text=paste("dat$",RO,"_I", sep="")))

或者
get(paste("dat$",RO,"_I", sep=""))

您知道如何解决循环不起作用的问题吗?非常感谢您的帮助 :) (我知道在这种情况下,我也可以使用as.numeric(levels(dat$IC_I))[dat$IC_I]但级别的顺序是错误的)

4
如下所示的答案建议,不要强行使用特定的方法。找到一种最优的方式来达到你的解决方案。 - Carl Witthoft
1个回答

10
你可以使用简单的赋值运算符来完成此操作——无需循环(通常在 R 中需要循环)。首先,我将构建一个示例数据框,将您的变量存储为字符类型而不是因子类型:

您可以使用简单的赋值运算符来完成此操作——无需循环(通常在 R 中需要循环)。首先,我将构建一个示例数据框,将您的变量存储为字符类型而不是因子类型:

dat <- data.frame(id=1:2, ID_I=c("Agree", "Strongly Disagree"), IG_I=c("Strongly Disagree", "Agree"), stringsAsFactors=FALSE)
dat
#   id              ID_I              IG_I
# 1  1             Agree Strongly Disagree
# 2  2 Strongly Disagree             Agree
现在您可以使用列索引将“强烈反对”替换为1:
cols <- c("ID_I", "IG_I")
dat[,cols][dat[,cols] == "Strongly Disagree"] <- 1
dat
#   id  ID_I  IG_I
# 1  1 Agree     1
# 2  2     1 Agree

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接