如何顺序连接对象列表中的每个nth:(nth + j)个对象

时间:2019-06-12 09:04:10

标签: r list for-loop seq

我希望将我拥有的对象列表中的每个nth:nth(+ jth)对象连接起来。更具体地说,我希望将每两个对象连接在一起。 下面是该列表的一小部分示例。

const db = require('path/to/sequelize/file');
db.Shop.create(data);

我想从中创建一个更接近此列表的新列表。

list("SRR1772151_1.fastq", "SRR1772151_2.fastq", "SRR1772152_1.fastq", 
    "SRR1772152_2.fastq", "SRR1772153_1.fastq", "SRR1772153_2.fastq")

我已尝试进行以下操作,但是我的for循环未成功。

list(c("SRR1772151_1.fastq", "SRR1772151_2.fastq"), c("SRR1772152_1.fastq", 
"SRR1772152_2.fastq"), c("SRR1772153_1.fastq", "SRR1772153_2.fastq"
))

任何帮助或建议,将不胜感激。

3 个答案:

答案 0 :(得分:1)

您可以将其分为两个问题-拆分列表,例如

elts = split(lst, 1:2)

并连接元素

Map(c, elts[[1]], elts[[2]])

但是我认为最好遵循“整洁”的数据做法并创建具有分组因子的单个向量

df = data.frame(fastq = unlist(x), grp = 1:2, stringsAsFactors = FALSE)

或更具有描述性

df = data.frame(
    fastq = unlist(lst),
    sample = factor(sub("_[12].fastq", "", unlist(lst))),
    stringsAsFactors = FALSE
)

最好使用整洁的数据,因为人们可以少做些事,例如,请注意,使用列表时,您必须了解split()Map()c(),而不用矢量和数据帧!

答案 1 :(得分:1)

这是使用数据帧的另一种尝试。输出是一个列表。

library(tidyverse)

data.frame(X1 = unlist(my_list), stringsAsFactors = F) %>% 
  group_by(str_sub(X1,1,10)) %>% # assuming first 10 characters forms the string
  summarise(list_value=list(X1)) %>% 
  pull(list_value)

答案 2 :(得分:1)

对于一般情况,您可以使用以下内容创建大小为j的连续组的向量:

ceiling(seq_along(x) / j)

…,然后使用tapply()连接这些组中的所有元素。与使用Map()不同,如果块大小没有均等地划分列表的长度,这也将起作用。

x <- list("SRR1772151_1.fastq", "SRR1772151_2.fastq", "SRR1772152_1.fastq",
    "SRR1772152_2.fastq", "SRR1772153_1.fastq", "SRR1772153_2.fastq")

tapply(x, ceiling(seq_along(x) / 2), unlist)
#> $`1`
#> [1] "SRR1772151_1.fastq" "SRR1772151_2.fastq"
#> 
#> $`2`
#> [1] "SRR1772152_1.fastq" "SRR1772152_2.fastq"
#> 
#> $`3`
#> [1] "SRR1772153_1.fastq" "SRR1772153_2.fastq"
tapply(x, ceiling(seq_along(x) / 4), unlist)
#> $`1`
#> [1] "SRR1772151_1.fastq" "SRR1772151_2.fastq" "SRR1772152_1.fastq"
#> [4] "SRR1772152_2.fastq"
#> 
#> $`2`
#> [1] "SRR1772153_1.fastq" "SRR1772153_2.fastq"

reprex package(v0.2.1)于2019-06-12创建