2016-11-14 5 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は同じものですが、そのクラスが異なっている(と関数がどの私はリストが文句渡しますそれ)。私はの構造を失うことなく、クラスのリストにd_list_autoを強制するにはどうすればよい

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

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

は私がas.list()と無駄に関数を適用するの異なる味を持つクラスの変更を強要しようとしました私のデータ?

EDIT

非常に厄介なソリューション:

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

は、誰かがよりエレガントな提案を持っていますか?

答えて

1

まず者は、各オブジェクトの構造を見てみましょう:唯一の違いはd_list_autotapply()から残って、dim属性を持っているということであるように

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" ... 

が見えます。新しい次元としてNULLを代入することでそれを削除できます。

dim(d_list_auto) <- NULL 

今では働いていた場合を見てみましょう:

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

は手動で '別の選択肢であるが、私はそれは' unname'する必要があるでしょうと思うかもしれない 'lapply(スプリット()、...)をやってdを正確に出力に合わせます。 – joran

関連する問題