我使用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,])
}
答案 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