Как последовательно объединить каждый объект nth: (nth + j) в список объектов - PullRequest
1 голос
/ 12 июня 2019

Я хочу объединить каждый объект nth: nth (+ jth) в список объектов, которые у меня есть.Более конкретно, я хотел бы, чтобы каждые два объекта были сцеплены.Небольшой образец рассматриваемого списка ниже.

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

Я хотел бы создать из этого новый список, который будет ближе к этому.

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

Я предпринял следующую попытку сделать это, но цикл for был неудачным,

for (i in seq(1,36, 2)) {
  for (j in 1:18) {
    unlist(List1[i:i+1]) -> List2[[j]]
  }
}

Буду очень признателен за любую помощь или совет.

Ответы [ 3 ]

1 голос
/ 12 июня 2019

Вот еще одна попытка использования фреймов данных. Результатом является список.

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)
1 голос
/ 12 июня 2019

Для общего случая вы можете создать вектор последовательных групп размером 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"

Создано в 2019-06-12 пакетом Представление (v0.2.1)

1 голос
/ 12 июня 2019

Вы можете разделить это на две проблемы - разбить список, например,

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(), а работать с векторами и данными. кадры у вас нет!

...