【问题标题】:R: Split dataframe into list by group and row iterationR:按组和行迭代将数据帧拆分为列表
【发布时间】:2019-08-31 02:16:23
【问题描述】:

我有一个这样的数据框:

set.seed(34)
startingframe <-  data.frame(
  group1=factor(rep(c("a","b"),each=3,times=1)),
  time=rep(1:3,each=1,times=2),
  othercolumn=rnorm(1:6)
)

...我试图将其处理成一个按组拆分的列表以及time 列的每个“迭代”,结果如下所示:

 $a1
  group1 time othercolumn
1      a    1    -0.13889

$a2
  group1 time othercolumn
1      a    1   -0.138890
2      a    2    1.199813

$a3
  group1 time othercolumn
1      a    1  -0.1388900
2      a    2   1.1998129
3      a    3  -0.7477224

$b1
  group1 time othercolumn
4      b    1  -0.5752482

$b2
  group1 time othercolumn
4      b    1  -0.5752482
5      b    2  -0.2635815

$b3
  group1 time othercolumn
4      b    1  -0.5752482
5      b    2  -0.2635815
6      b    3  -0.4554921

我想我只需要将迭代位合并到这段代码中:

split_list <- split(startingframe,list(startingframe$group1,startingframe$time))

编辑:我可能过度简化了最初的问题,但真正的数据集有额外的列需要在列表中引入。

【问题讨论】:

    标签: r list split


    【解决方案1】:

    此处不拆分,而是生成所需的输出。

    genlist = function(l,t){return((data.frame(group1=rep(x = l,times=t),time=seq(from=1,to = t,by = 1))))}
    
    mapply(genlist,startingframe$group1,startingframe$time,SIMPLIFY = FALSE)
    

    【讨论】:

    • 如果我们想在表格中引入额外的列,有什么方法可以实现吗?
    【解决方案2】:

    一种方法是在另一个lapply 中使用lapply

    lapply(levels(startingframe$group1), function(group) {
      df = startingframe[startingframe$group1 == group, ]
      lapply(df$time, function(time) {
        df[df$time %in% 1:time, ]
      })
    })
    
    [[1]]
    [[1]][[1]]
      group1 time
    1      a    1
    
    [[1]][[2]]
      group1 time
    1      a    1
    2      a    2
    
    [[1]][[3]]
      group1 time
    1      a    1
    2      a    2
    3      a    3
    
    
    [[2]]
    [[2]][[1]]
      group1 time
    4      b    1
    
    [[2]][[2]]
      group1 time
    4      b    1
    5      b    2
    
    [[2]][[3]]
      group1 time
    4      b    1
    5      b    2
    6      b    3
    

    【讨论】:

      【解决方案3】:

      您可以将head 用于序列1:nrow(x) 中的每个数字,用于您数据的每个子组x

      out <- lapply(split(df, df$group1), function(x) lapply(1:nrow(x), head, x = x))
      out <- unlist(out, recursive = F)
      
      out
      # $`a1`
      #    group1 time
      # 1:      a    1
      # 
      # $a2
      #    group1 time
      # 1:      a    1
      # 2:      a    2
      # 
      # $a3
      #    group1 time
      # 1:      a    1
      # 2:      a    2
      # 3:      a    3
      # 
      # $b1
      #    group1 time
      # 1:      b    1
      # 
      # $b2
      #    group1 time
      # 1:      b    1
      # 2:      b    2
      # 
      # $b3
      #    group1 time
      # 1:      b    1
      # 2:      b    2
      # 3:      b    3
      

      您可能不需要创建所有这些数据帧的列表,您只需创建索引列表并根据需要使用它们。

      inds <- 
        lapply(split(seq(nrow(df)), df$group1), function(x) 
          lapply(1:length(x), function(y) x[seq(y)]))
      
      inds
      # $`a`
      # $`a`[[1]]
      # [1] 1
      # 
      # $`a`[[2]]
      # [1] 1 2
      # 
      # $`a`[[3]]
      # [1] 1 2 3
      # 
      # 
      # $b
      # $b[[1]]
      # [1] 4
      # 
      # $b[[2]]
      # [1] 4 5
      # 
      # $b[[3]]
      # [1] 4 5 6
      
      df[inds$b[[2]]]
      #    group1 time
      # 1:      b    1
      # 2:      b    2
      

      【讨论】:

      • 我猜这里的问题是它创建了一个列表列表?
      • 如果您希望将unlist 用作单个数据框列表,则可以使用它。我编辑了答案。
      猜你喜欢
      • 1970-01-01
      • 2019-06-16
      • 2020-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-07
      • 1970-01-01
      • 2020-06-22
      相关资源
      最近更新 更多