重命名由当前名称引用的多个数据框列

Posted

技术标签:

【中文标题】重命名由当前名称引用的多个数据框列【英文标题】:Rename multiple dataframe columns, referenced by current names 【发布时间】:2012-03-06 04:36:20 【问题描述】:

我想重命名 large 数据框的一些随机列,并且我想使用当前列名,而不是索引。如果我在数据中添加或删除列,列索引可能会发生变化,因此我认为使用现有列名是一种更稳定的解决方案。 这就是我现在拥有的:

mydf = merge(df.1, df.2)
colnames(mydf)[which(colnames(mydf) == "MyName.1")] = "MyNewName"

我可以简化这段代码吗,无论是原始的merge() 调用还是只是第二行? "MyName.1" 实际上是两个不同 xts 对象的 xts merge 的结果。

【问题讨论】:

您能否提供一个具有所需输出的小型可重复数据集? 你不需要which! R 在运算符 [] 中接受布尔值。 colnames(mydf)[colnames(mydf)=="MyName.1"] = "MyNewName" 应该可以工作! names(mydf)[names(mydf) == "MyName.1"] = "MyNewName" ... 大约短了 13 个字符。尽管在这种情况下您可能想要替换向量,但请使用 %in% 而不是 ==。 @BrandonBertelsen,您能否重新发表您的评论作为答案?通过这种方式,社区可以看到问题正在得到解决,并且您将获得一些代表。 我认为这不应该被标记为data.table,因为这是关于数据帧的(即使下面提到了数据表)。重命名数据表中的列的正确方法是使用setnames 【参考方案1】:
names(mydf)[names(mydf) == "MyName.1"] = "MyNewName" # 13 characters shorter. 

虽然,您最终可能希望替换一个向量。在这种情况下,请使用 %in% 而不是 == 并将 MyName.1 设置为与 MyNewName 等长的向量

【讨论】:

【参考方案2】:
names(mydf) <- sub("MyName\\.1", "MyNewName", names(mydf))

如果您使用gsub 而不是sub 将词干作为要替换的模式,这将更好地推广到多名称更改策略。

【讨论】:

谢谢,这让我走上了正确的道路。我现在正在做:names(df)[grep(".1", names(df))] = c("AName.Col1", "AName.Col2", "AName.Col3")【参考方案3】:

更改data.frame 的列名的问题在于,几乎令人难以置信的是,整个data.frame 都被复制了。即使它在.GlobalEnv 中并且没有其他变量指向它。

data.table package 有一个setnames() 函数,它通过引用更改列名,而无需复制整个数据集。 data.table 的不同之处在于它不会在写入时复制,这对于大型数据集非常重要。 (您确实说过您的数据集很大。)。只需提供 oldnew 名称:

require(data.table)
setnames(DT,"MyName.1", "MyNewName")
# or more explicit:
setnames(DT, old = "MyName.1", new = "MyNewName")
?setnames

【讨论】:

嘿。这是对data.frame 做几乎任何事情的问题。你会认为仅仅改变因子水平也会很快,但事实并非如此。 (我相信所有人都知道这一点。) @DWin。你好。我认为data.table 中的setattrib() 可以通过引用更改列的级别(也可以在data.frame 中)。显然需要小心处理。可能有一个新的setlevels() 函数可以改变一个或多个级别(与setnames() 具有相同的界面)?顺便说一句,:= 已经通过引用添加了新的因子水平,这在基础上很棘手。这背后有相当多的 C 代码。 请注意,您也可以更新名称列表,这是一个方便的 sn-p setnames( dt, names(dt), snakecase::to_snake_case(names(dt)) )【参考方案4】:

plyr 有一个重命名功能就是为了这个目的:

library(plyr)
mydf <- rename(mydf, c("MyName.1" = "MyNewName"))

【讨论】:

这个函数现在也包含在dplyr包中。【参考方案5】:

你可以使用stringr包的str_replace函数:

names(mydf) <- str_replace(names(mydf), "MyName.1", "MyNewName")

【讨论】:

以上是关于重命名由当前名称引用的多个数据框列的主要内容,如果未能解决你的问题,请参考以下文章

r R重命名数据框列

用名称中的句点重命名clickhouse中的列

使用 pandas 重命名数据框列中的元素

使用 Pyspark 动态重命名数据框列

KeyError:重命名数据框列后为 1.0

在 spark python 中重命名数据框列