Добавьте содержимое строк в конец столбца другой строки

#r #dataframe

#r #фрейм данных

Вопрос:

У меня есть следующий фрейм данных:

 > df
GENE     ID     EXPR1     EXPR2
ENS127   1122O   1.2       1.2
ENS127   1122O   2.3       1.0
ENS555   33212   4.5       3.9
ENS555   33212   1.2       3.7
ENS941   44444   2.3       3.6
 

Я ищу способ объединить все строки с похожим геном в одну, чтобы для каждого уникального ГЕНА была только одна строка, содержащая все значения третьего столбца и далее. Это будет повторяться до конца большого фрейма данных.
Результат будет выглядеть следующим образом:

 > df.output
GENE     ID     EXPR1   EXPR2   EXPR.01   EXPR.02  
ENS127   1122O   1.2     1.2     2.3        1.0     
ENS555   33212   4.5     3.9     1.2        3.7
ENS941   44444   2.3     3.6     NA        NA
 

Я ценю любую помощь.

Ответ №1:

Вы можете получить данные в длинном формате, чтобы все EXPR значения были в одном столбце, создать уникальные имена столбцов для каждого GENE , а затем получить данные в широком формате.

 library(dplyr)
library(tidyr)

df %>%
  pivot_longer(cols = starts_with('EXPR')) %>%
  group_by(GENE, name) %>%
  mutate(name = paste(name, row_number(), sep = '_')) %>%
  pivot_wider()

#   GENE   ID    EXPR1_1 EXPR2_1 EXPR1_2 EXPR2_2
#  <chr>  <chr>   <dbl>   <dbl>   <dbl>   <dbl>
#1 ENS127 1122O     1.2     1.2     2.3     1  
#2 ENS555 33212     4.5     3.9     1.2     3.7
#3 ENS941 44444     2.3     3.6    NA      NA  
 

данные

 df <- structure(list(GENE = c("ENS127", "ENS127", "ENS555", "ENS555", 
"ENS941"), ID = c("1122O", "1122O", "33212", "33212", "44444"
), EXPR1 = c(1.2, 2.3, 4.5, 1.2, 2.3), EXPR2 = c(1.2, 1, 3.9, 
3.7, 3.6)), class = "data.frame", row.names = c(NA, -5L))
 

Комментарии:

1. спасибо, Ронак. Он выдает ошибку, которая гласит: Ошибка: cols необходимо выбрать хотя бы один столбец, однако использование функции starts_with имеет для меня смысл, похоже, не распознает шаблон строки.

Ответ №2:

Вот data.table решение

 library(data.table)
setDT(df)[, rid := rowid(GENE, ID)]
dcast(df, GENE   ID ~ rid, sep = ".", value.var = c("EXPR1", "EXPR2"))
 

Выходной сигнал

      GENE    ID EXPR1.1 EXPR1.2 EXPR2.1 EXPR2.2
1: ENS127 1122O     1.2     2.3     1.2     1.0
2: ENS555 33212     4.5     1.2     3.9     3.7
3: ENS941 44444     2.3      NA     3.6      NA