Разделение столбца данных на несколько столбцов

Скажем, у меня есть кадр данных, который выглядит так:

gene    drug    log2FC
Ubb    Naloxone    0.6375514
Tuba1a   Naloxone    0.5827224
Scd1    Naloxone    -0.7249997
Ubb    Aspirin    0.8000
Tuba1a    Aspirin  0.73324
Scd1    Aspirin    0.2497
Ubb    Haldol    0.0375
Tuba1a    Haldol    0.25824
Scd1    Haldol    -0.0249997

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

gene    Naloxone_log2FC    Asirin_Log2FC    Haldol_log2FC
Ubb     0.6375514    0.73324    0.0375
Tuba1a  ...
Scd1    ...

Thanks!

person bdevil    schedule 11.11.2019    source источник
comment
Предоставьте воспроизводимый минимальный пример. В частности, предоставьте некоторые образцы данных, например. с dput().   -  person mnist    schedule 12.11.2019
comment
Взгляните на функцию pivot_wider из tidyr tidyr.tidyverse.org/reference/pivot_wider.html   -  person fmarm    schedule 12.11.2019


Ответы (2)


Вы можете использовать tidyr::spread() более нового tidyr::pivot_wider() :

library(tidyr)

data <- read.table(h=T, strin=F, text="gene    drug    log2FC
Ubb    Naloxone    0.6375514
Tuba1a   Naloxone    0.5827224
Scd1    Naloxone    -0.7249997
Ubb    Aspirin    0.8000
Tuba1a    Aspirin  0.73324
Scd1    Aspirin    0.2497
Ubb    Haldol    0.0375
Tuba1a    Haldol    0.25824
Scd1    Haldol    -0.0249997")

data %>% spread(drug, log2FC)
#>     gene Aspirin     Haldol   Naloxone
#> 1   Scd1 0.24970 -0.0249997 -0.7249997
#> 2 Tuba1a 0.73324  0.2582400  0.5827224
#> 3    Ubb 0.80000  0.0375000  0.6375514

data %>% pivot_wider(names_from = "drug", values_from = log2FC)
#> # A tibble: 3 x 4
#>   gene   Naloxone Aspirin  Haldol
#>   <chr>     <dbl>   <dbl>   <dbl>
#> 1 Ubb       0.638   0.8    0.0375
#> 2 Tuba1a    0.583   0.733  0.258 
#> 3 Scd1     -0.725   0.250 -0.0250

Создано 11 ноября 2019 г. с помощью пакета reprex (v0.3.0)

person Moody_Mudskipper    schedule 11.11.2019
comment
Хм, есть ли способ изменить имена столбцов на то, как выглядит ожидаемый результат OP? (т. е. Naloxone_log2FC и т. д.) Я бросил быстрый взгляд на виньетку pivot(), и хотя я увидел, что добавление префиксов возможно, похоже, ничего не говорится о возможности добавления суффиксов. - person Dunois; 12.11.2019
comment
на самом деле это невозможно по умолчанию, но просто используйте %>% rename_at(-1, paste0, "_log2FC") в конце цепочки каналов, и вы получите свои суффиксы :) - person Moody_Mudskipper; 12.11.2019

Вы можете использовать функцию spread пакета tidyr (я предполагаю, что ваш фрейм данных df):

library("tidyr")

df = spread(df, drug, log2FC)

Чтобы добавить «_log2FC» к именам столбцов, вы можете использовать:

for (i in 2:length(colnames(df))) {
  colnames(df)[i] = paste0(colnames(df)[i], "_log2FC")
}
person Stanislas Morbieu    schedule 11.11.2019