将 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
我使用 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