2016-11-14 105 views
2

我有一個數據框的名稱和值必須轉換成矢量列表。名稱決定了每個值必須分配在哪個向量中。爲了使自動化我的列表的創建,我使用tapply:如何將列表中的類從數組更改爲列表?

d_df <- data.frame(name=c(rep("a",5),rep("b",5)),value=LETTERS[1:10]) 
d_list_auto <- tapply(d_df$value,d_df$name, FUN=as.character) 
d_list_auto <- unname(d_list_auto) 
d_list_manual <- list(LETTERS[1:5],LETTERS[6:10]) 

對於實際效果,d_list_auto和d_list_manual都是一樣的東西,但是他們班是不同的(和功能,而我通過列表抱怨它)。

class(d_list_auto) #array 
class(d_list_manual) #list 

我試圖強迫與as.list()和應用功能無濟於事的不同口味的類別改變:

class(as.list(d_list_auto)) #array 
apply(d_list_auto,1,as.list) #Creates a list of lists 

我怎麼能強迫d_list_auto到類列表不失的結構我的數據?

編輯

一個非常討厭的解決方案:

class(apply(d_list_auto,1,as.list)) #list 

有人做過一個更優雅的建議?

回答

1

首先讓我們來看看每個對象的結構:

str(d_list_auto) 
# List of 2 
# $ : chr [1:5] "A" "B" "C" "D" ... 
# $ : chr [1:5] "F" "G" "H" "I" ... 
# - attr(*, "dim")= int 2 

str(d_list_manual) 
# List of 2 
# $ : chr [1:5] "A" "B" "C" "D" ... 
# $ : chr [1:5] "F" "G" "H" "I" ... 

貌似唯一的區別是d_list_autodim屬性,從tapply()遺留下來的。我們可以通過指定NULL作爲新維度來刪除它。

dim(d_list_auto) <- NULL 

現在讓我們來看看它的工作:

class(d_list_auto) 
# [1] "list" 
identical(d_list_auto, d_list_manual) 
# [1] TRUE 
+0

手動做'lapply(分裂(),...)'可能是另一種選擇,但我認爲這將需要'unname' d完全匹配輸出。 – joran

相關問題