我有一份表格清单:
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中列表的索引。
感谢您的任何建议。
答案 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"