我有一个包含名称和值的数据框架,必须将其转换为向量列表。这些名称决定了必须在哪个向量中分配每个值。为了自动创建我的列表,我使用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()和不同风格的apply函数强制改变类,但无济于事:
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
有人有更优雅的建议吗? 首先让我们看一下每个对象的结构:
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_auto
具有dim
属性,这是tapply()
遗留下来的。我们可以通过将NULL
赋值为新的维度来消除它。
dim(d_list_auto) <- NULL
现在让我们看看它是否有效:
class(d_list_auto)
# [1] "list"
identical(d_list_auto, d_list_manual)
# [1] TRUE