【发布时间】:2019-03-19 02:29:22
【问题描述】:
我有一个数据框(从 Excel 工作表中导入,我在其中逐行编写了字符串列表)并希望将行转换为向量列表,其中每个向量包含该行的非缺失单元格值:
例如:
#Sample data frame
dfX <- data.frame(C0 = c(1,2,3),
C1 = c("Apple","Apple","Pear"),
C2 = c("Banana","Orange", "Lemon"),
C3 = c("Pear","Melon", ""))
这将用于生成以下列表:
myList = list(c("Apple","Banana", "Pear"),
c("Apple","Orange", "Melon"),
c("Pear","Lemon"))
请注意,第三个向量被截断为两个元素,因为单元格包含一个空字符串。另请注意,索引 (C0) 已删除。
我见过一些将数据框转换为矩阵并使用 split 函数将结果粘贴到全局环境中的示例,例如
list2env(setNames(split(as.matrix(dfX),
row(dfX)), paste0("Row",1:3)),
envir=.GlobalEnv)
但我想知道是否有 (a) 一个更新的 tidyverse 函数来处理这个问题,以及 (b) 一种直接填充到列表的方法(我稍后想针对该列表应用一个函数)。如果可能,还希望在进入列表的过程中处理缺失值!
【问题讨论】:
-
data.frame实际上是一个向量列表。所以,class(dfX) <- "list" -
或
as.list(dfX)。无论哪种方式,首先将空字符串转换为NA_character_可能会让您的生活更轻松。如果您从 csv 读取数据,请注意方便的参数na.strings在导入期间执行此操作。 -
@Khashaa 这不会重现 OP 的预期输出; OP 在逐行(而不是逐列)操作之后。您的解决方案将
data.frame转换为列向量的list。 OP 想要一个list的行向量。 -
@MauritsEvers 没有注意到行已转置。
gather(dfX, var, val, -C0) %>% spread(C0, val) %>% map(c)`