基于奇数/偶数索引将列表拆分为两个列表

时间:2014-06-25 11:28:44

标签: r list

我有一份表格清单:

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

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

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

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

感谢您的任何建议。

3 个答案:

答案 0 :(得分:7)

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。

答案 1 :(得分:1)

我认为您可以使用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

答案 2 :(得分:0)

我有时发现,通过将列表强制为数据框并使用现代的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"