Р: Как я могу перенести выборку из каждых 5 строк в одну строку? - PullRequest
0 голосов
/ 17 апреля 2019

У меня есть набор данных в следующем (аккуратном) формате:

SAMPLE, MARKER, ALLELE, LENGTH, PEAK
BRIS01, B100, allele 1, NA, 126.95
BRIS01, B100, allele 2, 160, 159.72
BRIS01, B100, allele 3, 162, 162.01
BRIS02, B100, allele 1, 152, 151.4
BRIS02, B100, allele 2, NA, NA
BRIS02, B100, allele 3, NA, NA

В целом, каждый образец имеет запись для 14 маркеров, и каждый маркер имеет записи для 5 аллелей, даже если запись просто'NA'.Я не уверен, сколько образцов есть.

Я потратил весь день, пытаясь реструктурировать его в следующий формат, чтобы для каждого образца все значения аллелей были рядом друг с другом для каждого маркера, нобезрезультатно:

                MARKER 1                              MARKER 2      MARKER 3
      SAMPLE 1, NA, 126.95, 160, 159.72, 162, 162.01, LENGTH, PEAK, LENGTH, PEAK
      SAMPLE 2, 152, 151.4, NA, NA, NA, NA,           LENGTH, PEAK, LENGTH, PEAK

Если формат выглядит немного неопрятно, надеюсь, это может помочь: в каждой строке должно быть 141 столбец;В первом столбце должно быть указано название образца, затем длина аллеля и размер пика для 5 аллелей каждого маркера.Например, Sample, длина маркера 1, пик 1 маркера 1, длина 1 маркера 2, пик 2 маркера, длина 1 маркера 2, пик 2 маркера и т. Д. Это немного нелогично, но представьте, что существуют заголовки столбцов длякаждый маркер, а затем вложенные столбцы для размера и пиков каждого аллеля.

Я пытался использовать dpylr, аккуратные данные, плавление, приведение, dcast, изменение формы, изменение формы2, транспонирование ... но я не очень хорошс R и не повезло.Использование длины и пика в качестве подколонок, вероятно, не очень хорошие / аккуратные данные на практике, но это то, что мой начальник попросил интерпретировать данные.Любая обратная связь приветствуется!

Спасибо!

РЕДАКТИРОВАТЬ: я выполнил следующий код в соответствии с предложением:

ultra_wide <-
  wide %>%
  group_by(SAMPLE, MARKER) %>%
  gather(key = "VARS", value = "VALS", c(LENGTH, PEAK)) %>%
  spread(MARKER, VALS) %>%
  summarize(MARKER1 = paste(c(B100), collapse = ", "), 
            MARKER2 = paste(c(B132), collapse = ", "),
            MARKER3 = paste(c(BL13), collapse = ", "),
            MARKER4 = paste(c(BT06), collapse = ", "),
            MARKER5 = paste(c(BT09), collapse = ", "),
            MARKER6 = paste(c(BT30), collapse = ", "),
            MARKER7 = paste(c(BTMS0044), collapse = ", "),
            MARKER8 = paste(c(BTMS0067), collapse = ", "),
            MARKER9 = paste(c(BTMS0106), collapse = ", "),
            MARKER10 = paste(c(B116), collapse = ", "),
            MARKER11 = paste(c(B118), collapse = ", "),
            MARKER12 = paste(c(B119), collapse = ", "),
            MARKER13 = paste(c(BT20), collapse = ", "),
            MARKER14 = paste(c(BTMS0114), collapse = ", "))

однако команда ничего не сделала, как следующая ошибкапроизошло:

Ошибка: дубликаты идентификаторов для строк (76, 77, 78, 79, 80), (30671, 30672, 30673, 30674, 30675), (81, 82, 83, 84, 85),(30676, 30677, 30678, 30679, 30680)

, что продолжалось еще несколько строк после этого.

1 Ответ

0 голосов
/ 18 апреля 2019

Ввод данных

Прежде всего, пожалуйста, отправьте код, воссоздающий ваш фрейм данных, чтобы следующий человек мог просто скопировать и вставить код и увидеть сам фрейм данных.Здесь я просто пытаюсь воссоздать фрейм данных в соответствии с вашими спецификациями, особенно в той части, где вы упоминаете, что на каждый маркер указывается пять аллелей.

# Vectors for dataframe

library(tidyverse)

SAMPLE <- c(rep("BRIS01", 5), rep("BRIS02", 5))
MARKER <- c(rep("B100", 5), rep("B200", 5))
ALLELE <- rep(paste("allele",1:5), times = 2)
LENGTH <- c(NA, 160, 162, 152, NA, NA, 160:163)
PEAK <- c(126.95,   159.72, 162.01, 151.4,  NA, NA, 150:153)

marker_data <- data.frame(SAMPLE, MARKER, ALLELE, LENGTH, PEAK, stringsAsFactors = FALSE)

marker_data
#>    SAMPLE MARKER   ALLELE LENGTH   PEAK
#> 1  BRIS01   B100 allele 1     NA 126.95
#> 2  BRIS01   B100 allele 2    160 159.72
#> 3  BRIS01   B100 allele 3    162 162.01
#> 4  BRIS01   B100 allele 4    152 151.40
#> 5  BRIS01   B100 allele 5     NA     NA
#> 6  BRIS02   B200 allele 1     NA     NA
#> 7  BRIS02   B200 allele 2    160 150.00
#> 8  BRIS02   B200 allele 3    161 151.00
#> 9  BRIS02   B200 allele 4    162 152.00
#> 10 BRIS02   B200 allele 5    163 153.00

Обратите внимание, что в data.frame я передаю опцию stringsAsFactors = FALSE поскольку работа с факторными переменными имеет тенденцию быть очень сложной .

"Распространение" ваших данных

Что касается вашего вывода, я вывожу то, что вы показали вТабличная форма как желаемый результат.Без дополнительных данных трудно получить 141 столбец, который вы хотите для каждой строки.Ключом к получению вашего ответа является «распространение» столбца MARKER после «сбора» (или «плавления», как его чаще называют) столбцов, которые имеют «значения», а именно столбцы LENGTH и PEAK.Перед распространением;тем не менее, вы должны создать столбец с уникальными значениями в случае, если распространение встречает идентичные строки.Наконец, вам нужно подвести итоги, чтобы получить по одной строке для каждого образца, хотя вы бы хотели перебрать столбцы MARKER1-MARKER14 для более оптимального / эффективного кода.В любом случае, я надеюсь, что это поможет.

marker_m <- 
  marker_data %>% 
  group_by(SAMPLE, MARKER) %>%
  gather(VARS, VALS, c(LENGTH, PEAK)) %>%
  mutate(i = row_number()) %>%
  spread(MARKER, VALS) %>% 
  summarize(MARKER1 = paste(c(B100), collapse = ", "), MARKER2 = paste(c(B200), collapse = ", "))

marker_m
#> # A tibble: 2 x 3
#>   SAMPLE MARKER1                                                  MARKER2 
#>   <chr>  <chr>                                                    <chr>   
#> 1 BRIS01 NA, 126.95, 160, 159.72, 162, 162.01, 152, 151.4, NA, NA NA, NA,~
#> 2 BRIS02 NA, NA, NA, NA, NA, NA, NA, NA, NA, NA                   NA, NA,~
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...