Транспонировать фрейм данных, если строки содержат два значения для одной и той же переменной в R - PullRequest
2 голосов
/ 20 февраля 2020

Я имею дело с фреймом данных, который содержит переменную с именем «Marker», которая показывает два значения всех выборок, которые я собрал. Например, кадр данных выглядит следующим образом:

Sample.File Sample.Name Marker value
1            a         a_1    xxx    16
2            a         a_1    xxx    18
3            a         a_1    yyy    16
4            a         a_1    yyy    20
5            a         a_1    zzz     9
6            a         a_1    zzz    13
7            b         b_1    xxx    10
8            b         b_1    xxx    10
9            b         b_1    yyy     6
10           b         b_1    yyy    12
11           b         b_1    zzz    14
12           b         b_1    zzz    14

, что обеспечивается следующим кодом:

data <- data.frame(
   Sample.File = as.factor(c("a", "a", "a", "a", "a", "a", "b", "b", "b", "b",
                             "b", "b")),
   Sample.Name = as.factor(c("a_1", "a_1", "a_1", "a_1", "a_1", "a_1", "b_1",
                             "b_1", "b_1", "b_1", "b_1", "b_1")),
        Marker = as.factor(c("xxx", "xxx", "yyy", "yyy", "zzz", "zzz", "xxx",
                             "xxx", "yyy", "yyy", "zzz", "zzz")),
   value = c(16L, 18L, 16L, 20L, 9L, 13L, 10L, 10L, 6L, 12L, 14L, 14L)
)

Новый кадр данных, с которым я хотел бы работать, должно быть достигнуто путем транспонирования текущих данных, но с сохранением столбцов Sample.File и Sample.Name для всех собранных образцов. Кроме того, я хотел бы получить новые переменные, которые будут помечены следующим образом (например, xxx & xxx.1, yyy & yyy.1, zzz & zzz.1) для столбца, помеченного как «значение».

Таблица, которую я хотел бы получить, выглядит следующим образом:

  Sample.File Sample.Name xxx xxx.1 yyy yyy.1 zzz zzz.1
1           a         a_1  16    18  16    20   9    13
2           b         b_1  10    10   6    12  14    14

Я хотел бы использовать код без записи названия меток, указанных в столбце «Маркер» (поскольку я мог получить до 100 различных этикеток). Я пытался использовать следующий код, но не смог достичь своей цели:

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

library(dplyr)
library(tidyr)
data %>%
  gather(Sample.File, Sample.Name) %>%
  spread(value)

Error: `var` must evaluate to a single number or a column name, not a double vector
Run `rlang::last_error()` to see where the error occurred.
In addition: Warning message:
attributes are not identical across measure variables;
they will be dropped

Я бы Буду очень признателен, если кто-нибудь сможет заняться этим вопросом!

1 Ответ

1 голос
/ 20 февраля 2020

Вот один из способов сделать это. Мы можем создать идентификатор для каждого Marker, а затем создать столбец. После этого мы можем преобразовать его в широкоформатный формат.

library(dplyr)
library(tidyr)

data2 <- data %>%
  group_by_at(vars(-value)) %>%
  mutate(N = row_number() - 1) %>%
  unite(col = "Marker", Marker, N, sep = ".") %>%
  pivot_wider(names_from = "Marker", values_from = "value") %>%
  ungroup()
data2
# # A tibble: 2 x 8
#   Sample.File Sample.Name xxx.0 xxx.1 yyy.0 yyy.1 zzz.0 zzz.1
#   <fct>       <fct>       <int> <int> <int> <int> <int> <int>
# 1 a           a_1            16    18    16    20     9    13
# 2 b           b_1            10    10     6    12    14    14
...