如何将列表的类从array更改为list

  • 本文关键字:array list 列表
  • 更新时间 :
  • 英文 :


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

最新更新