我想在R中使用循环进行一些计算。
我尝试assign
但它仍然效果不佳。
有人可以给我一个关于如何在R中设置正确变量的提示吗?
# My data
data <- read.table(textConnection("
a1 a2
a1 1.00000000 0.4803088
a1 0.48030878 1.0000000
"), header = TRUE)
no <- 2
for (k in 1:no){
paste0("dat.",k) <- aggregate(data[,c(paste0("a",k),paste0("b",k), paste0("b",k))],list(data$id),mean)
paste0("cor.",k) <- cor(paste0("dat.mean.",k),use = "complete.obs")
paste0("cal.",k) <- as.data.frame(paste0("dat.mean.",k))
paste0("lm.",k) <- lm(paste0("a",k) ~ paste0("b",k),data = paste0("lm.cal.",k))
}
答案 0 :(得分:1)
我不确定你会使用哪种语言(SAS可能?)但R是一种正确的函数式编程语言,并且不使用宏来自动执行任务。这是一种更像R的方法来解决问题
no <- 2
results <- lapply(1:no, function(k) {
# use aggregate function to make correlation calculation.
this_dat_mean <- aggregate(data[,c(paste0("y", c("f","p","c"), "_",k))], list(data$id), mean)
this_cor <- cor(this_dat_mean, use = "complete.obs")
#write.table(this_cor, "file_path", row.names=T, col.names=T, quote=F)
# calculate the lm
this_lm_cal <- as.data.frame(this_dat_mean)
this_lm <- lm(reformulate(paste0("yc_",k), paste0("yf_",k)), data = this_lm_cal)
#write.table(this_lm, "file_path2", row.names=T, col.names=T, quote=F)
list(lm=this_lm, cor=this_cor)
})
请注意,我们使用函数迭代感兴趣的输入。这个函数有一堆局部变量。我们可以从函数中返回我们想要保留的值列表。我们可以通过查看
来了解它们 results[[1]]$lm
results[[2]]$cor
例如,。最好在R中创建一个(可能是命名的)值列表,而不是创建一堆类似命名的变量。
lm
模型不是data.frame,因此您无法使用write.table
。不确定目标是什么。
答案 1 :(得分:0)
对于您的用例,我是MrFlick的第二点,并建议重写您的代码。
然而,由于我有时候自己更喜欢在某些情况下动态生成的变量而且R是凌乱的并且允许你以选择的方式这样做(有些东西有效,有些则没有),我想简要解释一下如何:< / p>
> k=4
> paste0("lm.", k)
[1] "lm.4"
> paste0("lm.", k) <- 1515
Error in paste0("lm.", k) <- 1515 :
target of assignment expands to non-language object
> assign ( paste0("lm.", k) , 1515 )
> paste0("lm.", k)
[1] "lm.4"
> eval(parse(text = paste0("lm.", k) ))
[1] 1515
> str(eval(parse(text = paste0("lm.", k) )))
num 1515
> str(paste0("lm.", k) )
chr "lm.4"
总结:每次使用粘合变量时,都必须通过eval / parse引用它。请记住<-
不能用作操作符 - 使用assign()