赋值目标扩展为非语言对象

时间:2017-04-11 16:02:29

标签: r

我想在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))

}

2 个答案:

答案 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()