2015-10-19 96 views
0

我想按列拆分我的數據框。聽起來微不足道,但我迄今沒有真正成功。 以下是我想出了:按列拆分數據幀

SG <- data.frame(num = 1:26, let = letters, LET = LETTERS) 
SG <- lapply(SG, function(x) split(x, colnames(SG))) 
str(SG) 

List of 3 
$ num:List of 3 
$ let:List of 3 
$ LET:List of 3 

我已成功將我的數據框成列表的列表。但我想有一個數據框列表,保留SG的rowname信息,並且它們中的每一個都包含最初數據框的一列。那可能嗎?

謝謝!

+0

你想要的輸出是什麼?包含一列的三個數據框的列表? – MrFlick

+0

是的,確切地說。我想要包含每個原始數據幀的一列的數據幀列表,所以我以後可以做「list2env」 – nouse

回答

3

這應該工作,行名保存。它返回一個數據幀列表:

SG <- lapply(SG, data.frame) 

str(SG) 
List of 3 
$ num:'data.frame': 26 obs. of 1 variable: 
    ..$ X..i..: int [1:26] 1 2 3 4 5 6 7 8 9 10 ... 
$ let:'data.frame': 26 obs. of 1 variable: 
    ..$ X..i..: Factor w/ 26 levels "a","b","c","d",..: 1 2 3 4 5 6 7 8 9 10 ... 
$ LET:'data.frame': 26 obs. of 1 variable: 
    ..$ X..i..: Factor w/ 26 levels "A","B","C","D",..: 1 2 3 4 5 6 7 8 9 10 ... 
+1

謝謝!然而,非常容易,姓名不會被保留。 – nouse

+0

不客氣。這將檢索這個colnames:'for(i in 1:length(SG))colnames(SG [[i]])< - 名稱(SG)[i]' – toldo

2

您可以使用

lapply(colnames(SG), function(x) SG[,x,drop=F]) 

與結構

List of 3 
$ :'data.frame': 26 obs. of 1 variable: 
    ..$ num: int [1:26] 1 2 3 4 5 6 7 8 9 10 ... 
$ :'data.frame': 26 obs. of 1 variable: 
    ..$ let: Factor w/ 26 levels "a","b","c","d",..: 1 2 3 4 5 6 7 8 9 10 ... 
$ :'data.frame': 26 obs. of 1 variable: 
    ..$ LET: Factor w/ 26 levels "A","B","C","D",..: 1 2 3 4 5 6 7 8 9 10 ... 

返回一個對象,在這種情況下,我們只是子集。對於data.frames,split()要將行而不是列分隔爲不同的組時更好。

+0

謝謝!由於某些原因,list2env(SG,envir = .GlobalEnv)在這裏不起作用? – nouse