如何将列表的类从数组更改为列表?

时间:2016-11-14 17:43:16

标签: r

我有一个包含名称和值的数据框,必须将其转换为矢量列表。名称确定必须在哪个向量中分配每个值。为了自动创建列表,我使用了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

有人有更优雅的建议吗?

1 个答案:

答案 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_autodim属性,遗留在tapply()。我们可以通过将NULL指定为新维度来删除它。

dim(d_list_auto) <- NULL

现在让我们看看它是否有效:

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