如何在使用管道 `%>%` 时使用 `<-` 分配行名?

How can I assign rownames with `<-` while using a pipe `%>%`?

我们可以使用 <- 运算符和 rownames(df) 来分配数据框的行名,如下所示:

df<-data.frame(a=letters[1:5], b=1:5, c=LETTERS[1:5])
df
rownames(df) <- df[,1]
df[,1] <- NULL
df

以上脚本会将第一列转换为rowname,输出如下:

df
  a b c
1 a 1 A
2 b 2 B
3 c 3 C
4 d 4 D
5 e 5 E

df
  b c
a 1 A
b 2 B
c 3 C
d 4 D
e 5 E 

有没有办法使用管道 %>% 来做到这一点?

我尝试了 df %>% rownames(.) <- .[,1] 但失败了。
关键问题是不能在%>%

之间使用<-

不使用任何额外的包,你可以通过

获得相同的结果
df1 <- data.frame(df[-1], row.names = df[,1])
df1
#  b c
#a 1 A
#b 2 B
#c 3 C
#d 4 D
#e 5 E

并且使用 dplyr 您可能只需 pull 列中的值即可分配给 rownames

library(dplyr)
rownames(df) <- df %>% pull(a)

虽然<-运算符看起来有些特殊,但当用来替换rownames()时,它实际上是`rownames<-`()函数的快捷方式,您可以直接在管道中调用它:

data.frame(a=letters[1:5], b=1:5, c=LETTERS[1:5]) %>%
    `rownames<-`(.[,1])

  a b c
a a 1 A
b b 2 B
c c 3 C
d d 4 D
e e 5 E

这是您在分配行名时实际总是使用的函数:

# When you write this
rownames(df) <- c(1:5)

# What R is actually doing is running this function:
`rownames<-`(df, c(1:5))

你也可以用 `colnames<-`()`names<-`() 做同样的事情

反引号 (`) 将某些东西定义为符号,即使它包含符号中非法的字符也是如此。将它括在反引号中告诉 R 你是 运行 一个名为 rownames<- 的函数,并将 .[,1] 作为参数传入。没有它,R 会在到达 < 符号时停止读取函数名称,并寻找正常的 rownames 函数,这不是我们想要的。

阅读此问题以获取有关反引号语法的更多详细信息:

df <- data.frame(a = letters[1:5], b = 1:5, c = LETTERS[1:5])
df
> df
  a b c
1 a 1 A
2 b 2 B
3 c 3 C
4 d 4 D
5 e 5 E
library(dplyr)
library(tibble)
df1 <- df %>% 
  tibble::column_to_rownames(var = "a")
df1  
> df1
  b c
a 1 A
b 2 B
c 3 C
d 4 D
e 5 E