将 data.frame 的所有数组列更改为列表

Change all array columns of a data.frame into lists

我使用 dplyr,它要求所有数据框或 tibble 列都是一维原子向量或列表。但有时我有带有数字数组列的数据框,如下所示:

d<- data.frame(x=c(1,2,3,4))
y= matrix(c(1,2,3, 11,12,13, 20,21,22, 23,24,25) ,nrow=4,ncol=3)
d$y = y
d$z= y
str(d)
# 'data.frame': 4 obs. of  3 variables:  
# $ x: num  1 2 3 4  
# $ y: num [1:4, 1:3] 1 2 3 11 12 13 20 21 22 23 ...  
# $ z: num [1:4, 1:3] 1 2 3 11 12 13 20 21 22 23 ...

如何将所有非原子列转换为列表?

这是一种转换一列的非矢量化方法,但我更喜欢矢量化代码,因为我的数据帧相当大:

d$l <- NaN
for (i in 1:nrow(d)) {
  d[i,]$l <- list(d$y[i,])
}

这行得通吗?

library(tidyverse)
map_if(d,is.matrix,~split(.,seq(nrow(.)))) %>% as_tibble
# # A tibble: 4 x 3
#       x y         z        
#   <dbl> <list>    <list>   
# 1     1 <dbl [3]> <dbl [3]>
# 2     2 <dbl [3]> <dbl [3]>
# 3     3 <dbl [3]> <dbl [3]>
# 4     4 <dbl [3]> <dbl [3]>

如果打印成 data.frame:

可能会更清楚
map_if(d,is.matrix,~split(.,seq(nrow(.)))) %>% as_tibble %>% print.data.frame
#   x          y          z
# 1 1  1, 12, 22  1, 12, 22
# 2 2  2, 13, 23  2, 13, 23
# 3 3  3, 20, 24  3, 20, 24
# 4 4 11, 21, 25 11, 21, 25