如何动态重命名数据帧的行?

nac*_*cab 6 r dataframe

我喜欢在飞行中重命名一个矢量 setNames(通过动态我的意思是一个返回对象的函数):

my_vector <- c(1,2,3)
setNames(my_vector, c("a","b","c"))
# a b c
# 1 2 3
Run Code Online (Sandbox Code Playgroud)

这也适用于数据框列名

my_df <- data.frame(matrix(1:9, nrow=3))
setNames(my_df, c("a","b","c"))
  a b c
1 1 4 7
2 2 5 8
3 3 6 9
Run Code Online (Sandbox Code Playgroud)

有没有办法对行名称做同样的事情?我认为这会起作用,但它没有:

t(setNames(t(my_df), c("a","b","c")))
Run Code Online (Sandbox Code Playgroud)

flo*_*del 6

我想你的意思通过对即时是你想要的功能恢复被修改的对象.既然rownames<-不适合你,你必须定义自己的功能:

setRowNames <- function(df, row.names) {
   rownames(df) <- row.names
   df
}
Run Code Online (Sandbox Code Playgroud)

您可以在脚本的顶部放置该功能定义,甚至可以将其隐藏在您的Rprofile或中Rprofile.site(?Startup如果您不熟悉).然后在你的代码中使用setRowNames(my_df, c("a", "b", "c")).它简洁,灵活,读取得很好.


t(setNames(t(my_df), c("a","b","c"))) 因为转置data.frame会为你提供一个没有名字但是rownames和colnames的矩阵.


Ric*_*rta 5

是的,你可以setattrdata.table包中使用

library(data.table)
(setattr(my_df, "row.names", c("a", "b", "c")))

  X1 X2 X3
a  1  4  7
b  2  5  8
c  3  6  9
Run Code Online (Sandbox Code Playgroud)

实际上,对象是在适当的位置修改的(这对大对象非常有用 - 不复制对象).几乎任何属性都可以使用它.

请注意,setattr无形地返回对象.


重要警告:

不同setNames的data.table功能setnamessetattr修改的对象,他们被称为上.如果您计划分配给新对象,则需要使用copy以下命令创建副本:

如果您在不知不觉中尝试了new_df <- setattr(my_df, "row.names", c("a", "b", "c")) 两者new_df并且my_df将具有相同的

在这种情况下,您需要使用copy(my_df):
new_df <- setattr(copy(my_df), "row.names", c("a", "b", "c"))

但是,如果你的目标是"重新分配"回来my_df,那么你可以省去一些按键:

 ## instead of 
 my_df <- setattr(my_df, "row.names", c("a", "b", "c"))

 ## you can simply execute 
 setattr(my_df, "row.names", c("a", "b", "c"))
Run Code Online (Sandbox Code Playgroud)