将R数据帧转换为向量列表

时间:2019-03-19 02:29:22

标签: r tidyverse

我有一个数据框(从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)一种直接填充到列表中的方法(我后来想对那个列表应用一个函数)。如果可能,还希望在列表中处理缺失值!

2 个答案:

答案 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_splitdplyr 0.8.0中可用。此外,这还假定您在每一行中都有唯一的C0,对于每一行,我们discard的任何值都等于空字符串(“”)。


或者在基数R中,splitlapply的组合也可以使用。

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选项是applyMARGIN = 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相同的属性。

相关问题