2015-01-15 50 views
0

我想將多個空列添加到多個數據框。我知道爲1個數據幀執行此操作的代碼是df[,namevector] <- NAother question)。 Namevector是一個包含應該添加的空變量名稱的向量。我有一個多個數據框的列表,所以我認爲下面的代碼可以做到這一點。將空列添加到多個數據框

a <- data.frame(x = 1:10, y = 21:30) 
b <- data.frame(x = 1:10, y = 31:40) 
c <- list(a,b) 
namevector <- c("z","w")  

EmptyVariables <- function(df) {df[,namevector] <- NA} 
sapply(X = c, FUN = EmptyVariables) 

我沒有收到錯誤消息,但是這兩行代碼也沒有添加空列。

+1

您沒有將結果賦給全局環境中的符號,所以它們只存在於sapply調用中,然後標記爲垃圾回收。儘管如此,'sapply'函數不會改變原始數據幀。歡迎使用函數式編程。 – 2015-01-15 18:18:36

+0

還有一個額外的問題,我不承認,那就是'EmptyVariables'函數的返回值是NA。它應該被定義爲'< - function(df){df [,namevector] < - NA; df}' – 2015-01-15 18:38:57

回答

1

原則上BondedDust的評論中有解決方案,但也許一些額外的解釋可能會有所幫助。

爲什麼你原來的代碼不工作?有兩件事情可以說一下:

  • 爲BondedDust提到的,功能EmptyVariables內部分配的功能的環境中進行。因此,只有本地副本的數據幀df發生了變化,但並非存在於全球環境中的df。調用EmtpyVariables(a)離開a不變。
  • 函數返回其最後一行的輸出。由於EmptyVariables的最後一行是賦值,並且由於賦值不會返回R中的任何內容,所以該函數也不會返回任何內容。這就是您撥打sapply只需撥打NA兩次的原因。 BondedDust已經指出瞭解決方案:函數體應該是{df[,namevector] <- NA;df}。在這種情況下,更改後的數據幀將作爲該函數的結果返回。

此外,還有關於sapply的評論:該函數試圖返回一個向量或矩陣。但是您的數據框列表不能通過這種方式進行合理的簡化,因此您應該使用lapply

最後,這是應該做你想要什麼代碼:

EmptyVariables <- function(df) {df[,namevector] <- NA;df} 
res <- lapply(X = c, FUN = EmptyVariables) 

res將包含兩個數據幀的列表。因此,res[[1]]res[[2]]將分別爲您添加ab空列。

+0

非常感謝。我根據BondedDusts的解釋計算出來的,但對於將來的參考可以有更詳細的解釋。 – 1053Inator 2015-01-16 12:20:59