代码之家  ›  专栏  ›  技术社区  ›  Alex Holcombe

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

  •  0
  • Alex Holcombe  · 技术社区  · 7 年前

    我用 dplyr ,它要求所有数据帧或可藏列都是1d原子向量或列表。但有时我有带数字数组列的数据帧,如下所示:

    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 回复  |  直到 7 年前
        1
  •  0
  •   moodymudskipper    7 年前

    这行吗?

    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