循环遍历R中的字符串变量

时间:2014-08-13 11:07:11

标签: r

我想循环一个字符串变量。例如:

clist <- c("BMI", "trig", "hdl")

for (i in clist) {
 data_FK_i<-subset(data_FK, subset= !is.na(FK) & (!is.na(i)))
}

“i”应从列表中收到不同的名称。 我究竟做错了什么?它不工作?添加“”似乎没有帮助。

感谢,

Einat

谢谢,“分配”答案完成了工作!!!!!!!!!!

3 个答案:

答案 0 :(得分:1)

尝试这样的事情,这会给你一个包含三个子集化数据帧的列表:

lapply(clist, function(x) data_FK[ !is.na(data_FK$FK) & !is.na(data_FK[,x]) ,])

代码中的问题是i是一个字符串,特别是clist循环的每次迭代中来自for的值之一。因此,当R读!is.na(i)时,你会说!is.na("BMI")等等。

Stack Overflow上的各个地方建议不要使用subset来支持提取索引(即[),就像上面的示例代码一样,因为subset依赖于non-standard evaluation这令人困惑,有时会让你陷入糟糕的兔子洞。

答案 1 :(得分:1)

我同意@Thomas。你应该使用一个列表。但是,让我演示如何修改代码以创建多个对象。您可以使用函数assign根据字符串创建对象。

clist <- c("BMI", "trig", "hdl")

for (i in clist) {
 assign(paste0("data_FK_", i), complete.cases(data[c("FK", i)]))
}

答案 2 :(得分:0)

这是你想要的吗?

你需要给循环一些东西来存储数据。 您还需要告诉循环您希望它运行多长时间。

clist <- c("BMI", "trig", "hdl")

#empty vector
data_FK<-c()

#I want a loop and it will 'loop' 3 times (1 to 3), which is the length of my list
for (i in 1:length(clist)) {
  #each loop stores the corresponding item from the list into the vector
  data_FK<-c(data_FK,clist[i])
}

## or if you want to store the values in a data frame
## there are other ways to create this, but here is a simple solution
data_FK<-data.frame(placer=1:length(clist))

for(i in 1:length(clist)){
  data_FK$items[i]<-clist[i]
}

## or maybe you just want to print the names
for (i in 1:length(clist)){
   print(clist[i])
}