2015-06-20 79 views
2

我正在嘗試編寫一些迭代通過數據框列表的代碼,向每個包含與舊列相同的值的新列添加1,該列中的第一個值是NA。下面是我的代碼:迭代地將新列添加到數據框列表

for(dataframe in 1:length(listOfDataFrames)){ 
    newColumn <- c(NA) 
    for(row in 1:(nrow(listOfDataFrames[[dataframe]]) - 1)){ 
     newColumn <- append(newColumn, listOfDataFrames[[dataframe]]$oldColumn[row]) 
    } 
    mutate(listOfDataFrames[[i]], newColumn = newColumn) 
} 

然而,當我在執行讀該代碼,我得到第一個數據幀的錯誤:

replacement has 894 rows, data has 895 

什麼導致這個錯誤?對不起,如果這是一個簡單的問題,我不是R的專家。

謝謝!

回答

3

你的代碼是一個事物的濃度,你應避免R中

  1. 不要使用for時,你可以使用lapply以上genrally xxapply家庭。
  2. 不要在循環內附加一行data.frame。這非常低效。你應該預先分配。使用lapply將爲您做到這一點。
  3. 請勿使用$裏面的功能。您應該使用[運算符
  4. 當您可以以矢量化方式執行操作時,無需遍歷data.frame。

下面我將如何做到這一點:

lapply(listOfDataFrames, function(DX){ 

     ## I assume that your DX has and "oldColum" variable 
     transform(DX,newColumn =c(NA,head(oldColumn,-1)) 

}) 
+0

謝謝!這對我有效。我不習慣lapply函數,所以我通過本能去循環,但是你的代碼更好!我沒有考慮使用head函數來創建新列。 關於$,爲什麼它被認爲是壞的?我已經看到它在教程中的函數內部使用,例如: https://www.stat.berkeley.edu/~spector/R.pdf – Shuklaswag

+0

我不喜歡本教程,但使用'$'是由於部分匹配而導致更寬容(例如輸入:ll < - list(yyaa = 1); ll $ y'),所以它是錯誤/錯誤的來源。最好只用於R控制檯。 – agstudy