重命名由当前名称引用的多个数据框列
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
的不同之处在于它不会在写入时复制,这对于大型数据集非常重要。 (您确实说过您的数据集很大。)。只需提供 old
和 new
名称:
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")
【讨论】:
以上是关于重命名由当前名称引用的多个数据框列的主要内容,如果未能解决你的问题,请参考以下文章