2017-10-06 207 views
0

我正在嘗試在r中創建一個for循環1.在數據框中創建新列並2.計算多個變量的一些簡單表達式。使用r for循環來創建數據幀中的新列

我的數據框有10列和22列

df <- setNames(data.frame(replicate(22,sample(0:10,10,rep=TRUE))), 
    sprintf("rmeas%s",seq(from = 0, to = 84, by = 4))) 

我想創建一個簡單的for循環來創建21個名爲「rmaster」後跟一個數字(4-84 4)新列。第一個新列(DF $ rmaster4)將通過以下計算來填充:

df$rmaster4 <- (df$rmeas4^3 + df$rmeas0*df$rmeas4+ df$rmeas0^2)/2.12352 

到目前爲止,我有以下代碼:

for(i in seq(from = 0, to = 84, by = 4)) { 

assign("df", `$<-`(df, paste0("rmaster", i+4), 
       (get(paste0("x$rmeas", i+4))^3 + 
       get(paste0("x$rmeas", i))*get(paste0("x$rmeas", i+4)) + 
       get(paste0("x$rmeas", i+4))^2)/2.12352)) 
} 

似乎有好多事錯在這裏。對於初學者,我想創建rmaster4-rmaster84,這個代碼會創建rmaster4-rmaster88。接下來,我知道我不能以我所擁有的方式使用get()函數。不幸的是,我無法補救這些問題。任何有識之士將不勝感激。

+1

'DF [[paste0( 「rmaster」,I + 4)]] = DF [[paste0( 「rmeas」,I + 4)]]^3 + ...' – eddi

+1

你不應該在R中使用'assign',除非你明白爲什麼你不應該在R.中使用'assign'。 – eddi

+0

謝謝。你的迴應現在對我來說似乎非常明顯。 你有什麼關於爲什麼使用'assign'是否是否定的鏈接?我很欣賞這種見解。 – afleishman

回答

1

首先回答你的問題,並按照上述EDDI的評論,這將是正確的代碼:

for(i in seq(from = 0, to = 80, by = 4)) { 
     print(paste0("rmeas", i+4)) 
     df[ , paste0("rmaster", i)] = (df[ ,paste0("rmeas", i+4)] ^3 + 
       df[ , paste0("rmeas", i)] * df[ ,paste0("rmeas", i+4)] + 
       df[ , paste0("rmeas", i+4)] ^2)/2.12352 
} 

請注意,我只走到i=80,因爲沒有rmeas88列。

甲多個R樣式的方式做同樣的將是:

i.v= seq(from = 0, to = 80, by = 4) 
A = sapply(i.v, function(i) { 
      (df[ ,paste0("rmeas", i+4)] ^3 + 
       df[ , paste0("rmeas", i)] * df[ ,paste0("rmeas", i+4)] + 
       df[ , paste0("rmeas", i+4)] ^2)/2.12352 
}) 
colnames(A) = paste0("rmaster", i.v) 
df = cbind(df, A)