2014-01-09 42 views
5

我創建了一個包含72個元素的R列表。我如何將這個文件列入72個單個數據框,每個元素的名稱?將列表文件取消到多個數據框

下面是一個例子:

L <- list(data.frame(matrix(1:4,2,2)), 
      data.frame(matrix(9:12,2,2)), 
      data.frame(matrix(5:8,2,2))) 
names(L)<-c("a","b","c") 

我怎樣才能得到三個dataframes,A,B和C?

回答

2

您可以使用assign來訪問lapply中的全球環境。注意我已將呼叫包裝在invisible中以避免將輸出打印到控制檯。

invisible(lapply(names(L),function(x) assign(x,L[[x]],.GlobalEnv))) 
ls() 
[1] "a" "b" "c" "L" 
a 
    X1 X2 
1 1 3 
2 2 4 

不過,雖然元素在列表中,他們可能會更容易使用,使用lapply例如。

7

有該功能...

list2env(L , .GlobalEnv) 

但是就像詹姆斯說,你需要有一個很好的理由不想讓他們在列表中。使用列表比使用單獨的data.frame s更容易。你想做什麼。

+1

我總是忘記這一點,並多次看到它+1。 –

+1

這是一個很好的認識+1 – James

+0

謝謝Janmes和Simon。他們非常有幫助。我爲自己創建了這個列表,但我的同事有時會使用一些單個文件。所以,我與他們分享。 –

1

這讓我想起了,但詹姆斯已經發布了一個更好的答案(本質上是相同的,但不太酷),然後西蒙,甚至更好。只是爲了完整性我會扔它,但聽取他們的警告:

for (i in seq_along(L)) { 
    assign(names(L)[i], L[[i]], .GlobalEnv) 
} 

編輯

根據康拉德的回答我才意識到,你可以這樣做:

for (i in names(L)) { 
    assign(i, L[[i]], .GlobalEnv) 
} 

我沒有知道for循環可以使用非索引。涼。

+2

爲什麼你迭代指數而不是名字?你永遠不需要指數。 –

+0

@Knonrad我完全同意這一點,正如我所說的,但是也承認它是迄今爲止最薄弱的解決方案,儘管遍歷名稱(據我所知,你所說的)需要'lapply'不是'for'循環。 –

+1

@Simon看到我的編輯,我剛剛意識到這一點。 –

相關問題