2013-02-06 67 views
7

列表我怎麼能轉換data.frame轉換一個data.frame到列表

df <- data.frame(id=c("af1", "af2"), start=c(100, 115), end=c(114,121)) 

LoL <- list(list(id="af1", start=100, end=114), list(id="af2", start=115, end=121)) 

我已經試過像

not.LoL <- as.list(as.data.frame(t(df))) 
東西列出清單

而且我真的不確定在這之後我最終會得到什麼,但它並不完全正確。我的要求是,我可以第一start通過命令來訪問,說,

> LoL[[1]]$start 
[1] 100 

not.LoL,我現在有給我下面的錯誤:

> not.LoL[[1]]$start 
Error in not.LoL[[1]]$start : $ operator is invalid for atomic vectors 

說明和/或解決方案,將極大地讚賞。

編輯:我應該明確指出,這裏的「id」實際上是非唯一的 - 在一個ID下可以有多個元素。所以我可以用不依賴唯一ID的解決方案來解決split

+0

可能重複[重塑矩陣到列表中](http://stackoverflow.com/questions/9195112/reshape-matrix-into-a-list-of-lists) – agstudy

+1

@agstudy:不是重複的:那個是關於粗糙的數組和'tapply',而這裏的這個看起來是矩形的,因此可以使用'lapply'來解決(如下所示)(http://stackoverflow.com/a/14730102/1468366)。 – MvG

+1

@MvG No。看到第一個解決方案,他提出了2個解決方案,其中一個採用'lapply',這顯然與此處提出的解決方案相同。第二個答案使用dlply就像我的這裏。 – agstudy

回答

7

使用plyr,你可以做到這一點

dlply(df,.(id),c) 

爲了避免ID分組,如果有多個(也許你需要改變列名,id對我來說是唯一的)

dlply(df,1,c) 
+0

對不起,對該列使用'id'令人困惑。感謝'plyr'解決方案! – MattLBeck

+0

+1我認爲'plyr'在這裏贏得了簡潔! –

+0

@agstudy在ID不是唯一的情況下使用第二種解決方案後,我發現解決方案實際上將按第一列進行分組。我在這裏錯過了什麼嗎? – MattLBeck

5
LMAo <- lapply(split(df,df$id), function(x) as.list(x)) # is one way 

# more succinctly 
# LMAo <- lapply(split(df,df$id), as.list) 

一個編輯的解決方案按您的評論:

lapply(split(df,seq_along(df[,1])), as.list) 
+0

這很棒,適用於我目前的目的。不過,就像@MvG所說的那樣,它是通過ID進行分組的,實際上我並不要求這些ID是唯一的。有沒有解決的辦法? – MattLBeck

+0

@Mottrition我更新我的解決方案。 – agstudy

+0

可以倒下,解釋我所做的事情有什麼問題,並且有點建設性? –

4

您可以使用apply把你的數據幀到這樣一個列表的列表:

LoL <- apply(df,1,as.list) 

然而,這將您所有的數據更改爲文本,因爲它通過一個單一的原子向量函數。

+0

如果你在data.frame和@Andrie中有數字/字符/因子,那麼這可能會很棘手。*「Dragons」* –

+0

+1爲LoL :)(列表變量名稱列表) – agstudy

+0

這很煩人,只適用於返回字符數據。否則,我喜歡這種解決方案的簡單性! – MattLBeck