2017-04-11 97 views
0

我想拍的使用環路一些計算在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)) 

} 
+1

'paste0()'返回一個字符值。你不能賦值給字符(即''蘋果「< - 3'在R中沒有意義)。你需要這些變量在循環後堅持嗎? – MrFlick

+0

謝謝,你介意給我一個快速的例子嗎?然後我可以按照你的提示完成它。 – BigSecrect

+0

@MFFlick Uhm。 ''蘋果「< - 3」在R中非常有意義,並且成功執行。我完全同意,在R以外沒有任何意義,但R是愚蠢的並且不同意。 –

回答

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

我不使用rstudio,所以我不確定你在說什麼。你想看到什麼,你現在看不到? – MrFlick

-1

對於您的使用案例,我先介紹一下MrFlick的建議,並提議重新編寫代碼。但是,由於我有時候自己更喜歡在某些情況下動態生成的變量,而且R是混亂的,並且允許您以選擇性的方式(有些事情有效,有些不行),我想簡單地向您解釋如何:

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