我有一个包含名称和值的数据框,必须将其转换为矢量列表。名称确定必须在哪个向量中分配每个值。为了自动创建列表,我使用了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
有人有更优雅的建议吗?
答案 0 :(得分: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_auto
有dim
属性,遗留在tapply()
。我们可以通过将NULL
指定为新维度来删除它。
dim(d_list_auto) <- NULL
现在让我们看看它是否有效:
class(d_list_auto)
# [1] "list"
identical(d_list_auto, d_list_manual)
# [1] TRUE