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

时间:2018-07-31 21:02:43

标签: r dataframe tibble

我使用dplyr,它要求所有数据框或小标题列均为一维原子向量或列表。但有时我的数据框带有数字数组列,例如:

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,])
}

1 个答案:

答案 0 :(得分:0)

这项工作吗?

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