【问题标题】:Can I use the unlist function in a dataframe?我可以在数据框中使用 unlist 函数吗?
【发布时间】:2020-06-08 18:58:11
【问题描述】:

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

【问题讨论】:

  • 数据框是列表——只是有更多的要求。在数据框上运行is.list()
  • 您可能还对unname()感兴趣

标签: r list function dataframe


【解决方案1】:

正如@Gregor 所说,data.frames 是列表。考虑以下示例:

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"

【讨论】:

  • 谢谢 - 我想这就是我今天的全部内容;)
猜你喜欢
  • 1970-01-01
  • 2020-11-01
  • 2022-01-16
  • 2018-02-28
  • 1970-01-01
  • 2014-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多