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

R 基于奇偶索引将列表拆分为两个列表,r,list,R,List,我有一份表格清单: 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]], ... new_dat_odd我认为您可以使用seq构建一个序列,并使用该序列对原始数据进行子集划分: lst <- lis

我有一份表格清单:

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]], ...

new_dat_odd我认为您可以使用
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
lst1)如果列表是
L
,那么我们可以使用此代码,我们注意到
1:2
会根据需要回收:

s <- split(L, 1:2)
2)这里是另一种方式:

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

is.odd我有时发现通过将列表强制到数据帧并使用现代的
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"))
使用modulo命令
%%
可以将行号除以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"
> 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"