如何在使用管道 `%>%` 时使用 `<-` 分配行名?
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
我们可以使用 <-
运算符和 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