如何设置使用管道%>%运算符传递的数据框的行名称?

时间:2016-02-20 01:55:50

标签: r dataframe dplyr magrittr

我有一个数据框,我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成为rownames,并在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

3 个答案:

答案 0 :(得分:18)

这会吗?

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

答案 1 :(得分:11)

使用更高版本的tidyverse,存在更优雅的解决方案:

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

重要的是,当转到rowname的列作为变量传递时,它也适用,这在函数内部是非常方便的!

答案 2 :(得分:2)

您可以使用magrittr别名set_rownames

df %>% set_rownames(.$ID_full)