我想循环一个字符串变量。例如:
clist <- c("BMI", "trig", "hdl")
for (i in clist) {
data_FK_i<-subset(data_FK, subset= !is.na(FK) & (!is.na(i)))
}
“i”应从列表中收到不同的名称。 我究竟做错了什么?它不工作?添加“”似乎没有帮助。
感谢,
Einat
谢谢,“分配”答案完成了工作!!!!!!!!!!
答案 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])
}