Как установить имена строк фрейма данных, передаваемого с оператором pipe %>%?
У меня есть фрейм данных, который я dcast
используя reshape2
пакет, и я хотел бы удалить первый столбец и вместо него стать именами строк фрейма данных.
Исходный кадр данных, перед dcast
:
> corner(df)
ID_full gene cpm
1 S36-A1 DDX11L1 0
2 S36-A1 WASH7P 0
3 S36-A1 MIR1302-2 0
4 S36-A1 FAM138A 0
5 S36-A1 OR4F5 0
pivot
функция для показа таблицы:
library(reshape2)
pivot <- function(x){
castTable <- x %>% dcast(ID_full ~ gene, value.var="cpm")
}
После dcast
завернутый в мой pivot
функция:
> corner(df)
ID_full 1060P11.3 A1BG A1BG-AS1 A1CF
1 S36-A1 0 0 0 0
2 S36-A10 0 0 0 0
3 S36-A11 0 0 0 0
4 S36-A12 0 0 0 0
5 S36-A2 0 0 0 0
Я бы хотел, чтобы ID_full стал именами строк и прекратил существовать в виде столбца, переданного после dcasting
, Я могу сделать это в несколько строк, каждый раз заменяя фрейм данных, но я бы хотел сделать все это, используя %>%
оператор.
Лучшая попытка, которую я могу придумать, будет включать что-то вроде этого, но, очевидно, это не сработает:
library(dplyr)
df <- df %>% pivot(.) %>% with(., row.names=df[,1])
Буду признателен за любые предложения... эта неприятность сводит меня с ума!
ОБНОВИТЬ:
Спасибо за ваши ответы:
Это выражение работает хорошо:
df <- df %>% pivot(.) %>% `rownames<-`(.[,1]) %>% select(-ID_full)
> corner(df)
1060P11.3 A1BG A1BG-AS1 A1CF A2M
S36-A1 0 0 0 0 0.00000
S36-A10 0 0 0 0 0.00000
S36-A11 0 0 0 0 0.00000
S36-A12 0 0 0 0 1.62189
S36-A2 0 0 0 0 1170.95000
4 ответа
С более поздней версией tidyverse
существует более элегантное решение:
df <- df %>% pivot(.) %>% column_to_rownames('ID_full')
Важно то, что он работает также, когда столбец для обращения к имени строки передается как переменная, что очень удобно, когда внутри функции!
Вы можете использовать magrittr
псевдоним set_rownames
:
df %>% set_rownames(.$ID_full)
df <- data.frame(x=1:2,y=3:4,k=c('a','b'))
df %>% data.frame(row.names = 'k') # remove column k
df %>% data.frame(row.names = 3) # remove column k
df %>% data.frame(row.names = .$k) # keep column k
df %>% data.frame(row.names = .[[3]]) # keep column k
df %>% data.frame(row.names = c('A','B')) # use any other vector as rowname