我有一个数据框(从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)一种直接填充到列表中的方法(我后来想对那个列表应用一个函数)。如果可能,还希望在列表中处理缺失值!
答案 0 :(得分:2)
如果您对tidyverse
方式感兴趣,那么一个选择就是
library(tidyverse)
dfX %>%
group_split(C0) %>% #Or use split(.$C0) if `dplyr` is not updated
map(~discard(flatten_chr(.), . == "")[-1])
#[[1]]
#[1] "Apple" "Banana" "Pear"
#[[2]]
#[1] "Apple" "Orange" "Melon"
#[[3]]
#[1] "Pear" "Lemon"
group_split
在dplyr 0.8.0
中可用。此外,这还假定您在每一行中都有唯一的C0
,对于每一行,我们discard
的任何值都等于空字符串(“”)。
或者在基数R中,split
和lapply
的组合也可以使用。
lapply(split(dfX[-1], dfX$C0), function(x) x[x != ""])
#$`1`
#[1] "Apple" "Banana" "Pear"
#$`2`
#[1] "Apple" "Orange" "Melon"
#$`3`
#[1] "Pear" "Lemon"
另一个基本的R选项是apply
和MARGIN = 1
apply(dfX[-1], 1, function(x) x[x!= ""])
答案 1 :(得分:1)
R的基本选项为by
by(dfX, dfX$C0, function(x) unlist(x[x != ''][-1]))
#dfX$C0: 1
#[1] "Apple" "Banana" "Pear"
#------------------------------------------------------------
#dfX$C0: 2
#[1] "Apple" "Orange" "Melon"
#------------------------------------------------------------
#dfX$C0: 3
#[1] "Pear" "Lemon"
by
将返回一个“整理的”列表,忽略与您期望的myList
相同的属性。