R语言 如何设置通过管道%>%操作符传递的数据框的行名称?

qyswt5oh  于 2023-10-13  发布在  其他
关注(0)|答案(4)|浏览(99)

我有一个数据框,我正在使用reshape2dcast,我想删除第一列,并将其改为数据框的行名称。
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之后, Package 在我的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之后管道化。我可以在几行代码中完成此操作,每次替换 Dataframe ,但我想使用%>%操作符完成所有操作。
我能想到的最好的尝试是这样的,但显然它不起作用:

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
hm2xizp9

hm2xizp91#

tibble的最新版本中,存在一个更优雅的解决方案:

df <- df %>% pivot(.) %>% tibble::column_to_rownames('ID_full')

重要的是,当要转换为行名的列作为变量传递时,它也可以工作,这在函数内部非常方便!

nkkqxpd9

nkkqxpd92#

这个可以吗?

iris %>% `rownames<-`(seq_len(nrow(iris)))
8yparm6h

8yparm6h3#

您可以使用magrittr别名set_rownames

df %>% set_rownames(.$ID_full)
gorkyyrv

gorkyyrv4#

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

相关问题