【问题标题】:splitting a list into two lists based on odd/even indices根据奇数/偶数索引将列表拆分为两个列表
【发布时间】:2014-06-25 11:28:44
【问题描述】:

我有一个表格列表:

dat[[1]], dat[[2]], ..., dat[[n]]

我想获得两个单独的列表,一个包含具有奇数索引的 dat,另一个包含偶数索引,即:

new_dat_odd <- dat[[1]], dat[[3]], dat[[5]], ...
new_dat_even <- dat[[2]], dat[[4]], dat[[6]], ...

在尝试这样做时,我的主要问题是我找不到如何引用 R 中列表的索引。

感谢您的任何建议。

【问题讨论】:

    标签: r list


    【解决方案1】:

    1) 如果L 是列表,那么我们可以使用此代码,我们注意到1:2 会根据需要被回收:

    s <- split(L, 1:2)
    

    1a) 无论列表是偶数还是奇数长度,上述方法都有效,但根据评论,如果奇数会发出警告。以下修改给出了相同的答案,但没有给出警告:

    s <- split(L, rep(1:2, length = length(L)))
    

    在上述任一s[[1]]s[[2]] 是两个列表。例如,

    > L <- as.list(1:10)
    > str(split(L, 1:2))
    List of 2
     $ 1:List of 5
      ..$ : int 1
      ..$ : int 3
      ..$ : int 5
      ..$ : int 7
      ..$ : int 9
     $ 2:List of 5
      ..$ : int 2
      ..$ : int 4
      ..$ : int 6
      ..$ : int 8
      ..$ : int 10
    

    2)这是另一种方式:

    is.odd <- rep(c(TRUE, FALSE), length = length(L))
    list(odd = L[is.odd], even = L[!is.odd])
    

    更新添加了 1a 和 2。

    【讨论】:

      【解决方案2】:

      我认为您可以使用seq 构建一个序列,并使用该序列对原始数据进行子集化:

      lst <- list(1:3, 2:4, 3:5)
      lst
      #[[1]]
      #[1] 1 2 3
      
      #[[2]]
      #[1] 2 3 4
      
      #[[3]]
      #[1] 3 4 5
      
      lst_even <- lst[seq(2,length(lst),2)]
      lst_odd <- lst[seq(1,length(lst),2)]
      
      
      lst_odd
      #[[1]]
      #[1] 1 2 3
      
      #[[2]]
      #[1] 3 4 5
      

      【讨论】:

        【解决方案3】:

        我有时发现通过将列表强制为数据框并使用现代dplyr 解决方案来处理列表更容易,所以这里有一个额外的选项。请注意,这是一个数据框,因此如果您有一个要使用的列表,请首先使用data.frame(yourlistname) 创建一个数据框。这是一些示例数据。

        library(dplyr)
        library(magrittr)
        
        structure(list(z = c(0.334237399835172, 0.468852147809068, 0.317526015236499, 
        0.487024179746106, 0.303294768702877, 0.502790849577665)), class = "data.frame", 
        row.names = c("lower1", "upper1", "lower2", "upper2", "lower3", "upper3"))
        

        使用取模命令%%,您可以将行号除以2 来识别奇数行和偶数行。

        > df %>% mutate(modulo=row_number() %% 2)
                  z modulo
        1 0.3342374      1
        2 0.4688521      0
        3 0.3175260      1
        4 0.4870242      0
        5 0.3032948      1
        6 0.5027908      0
        

        现在您可以选择偶数行了:

        > df %>% slice(which(row_number() %% 2 == 1))
                  z
        1 0.3342374
        2 0.3175260
        3 0.3032948
        

        或者选择奇数行:

        > df %>% slice(which(row_number() %% 2 == 0))
                  z
        1 0.4688521
        2 0.4870242
        3 0.5027908
        

        或者通过向管道添加更多信息直接获取向量:

        > df %>% slice(which(row_number() %% 2 == 1)) %>% unname() %>% unlist() -> your.data
        
        > your.data
        [1] 0.3342374 0.3175260 0.3032948
        
        > typeof(your.data)
        [1] "double"
        

        【讨论】:

          猜你喜欢
          • 2011-12-18
          • 2013-10-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-01-28
          • 1970-01-01
          • 2012-09-06
          • 2020-01-14
          相关资源
          最近更新 更多