r语言 - 是否可以在数据帧中使用取消列表功能?



我正在使用一个列表,其中包含文本中的单词和对其进行分类的标签。我应该恢复一个旧字母,为此我只需要提取向量中的单词,所以我没有使用 sapply,而是这样做了:words <- unlist(data.frame(letter)[1,], use.names = FALSE)它似乎有效,但辅助教授说这样做是一个问题,因为您只能在列表中使用取消列表,所以我修复了它,但最终结果是一样的。 PS:我知道使用sapply更有效,我只是不记得功能,我只是好奇是否可以在其他对象中使用取消列表

正如@Gregor所指出的,data.frame是列表。请考虑以下示例:

df <- data.frame(Col1 = LETTERS[1:5], Col2 = 1:5, stringsAsFactors = FALSE)
is.list(df)
#[1] TRUE

因此,可以在data.frame上使用lapply来执行逐列操作:

lapply(df,paste0, collapse = "")
#$Col1
#[1] "ABCDE"
#$Col2
#[1] "12345"

但是,在子集data.frame时,您必须小心,因为根据您使用的方法,您可能无法获得列表。

df["Col2"]
#  Col2
#1    1
#2    2
#3    3
#4    4
#5    5
is.list(df["Col2"])
#[1] TRUE
df[,"Col2"]
#[1] 1 2 3 4 5
is.list(df[,"Col2"])
#[1] FALSE
is.list(df[["Col2"]])
#[1] FALSE
is.list(df$Col2)
#[1] FALSE
is.list(subset(df,select = Col2))
#[1] TRUE

但是,据我所知,子集整行总是返回一个列表。

df[1,]
#  Col1 Col2
#1    A    1
is.list(df[1,])
#[1] TRUE
is.list(subset(df,1:5 == 1))
#[1] TRUE

我们可以使用dput函数来查看单行底层结构的文本表示:

dput(df[1,])
#structure(list(Col1 = "A", Col2 = 1L), row.names = 1L, class = "data.frame")

如我们所见,即使是单行也显然是一个列表。因此,我们可以合理地unlist该行,就像我们对任何不是data.frame的列表一样。

unlist(df[1,], use.names = FALSE)
#[1] "A" "1"
unlist(list(Col1 = "A", Col2 = 1L), use.names = FALSE)
#[1] "A" "1"

最新更新