Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
重命名由当前名称引用的多个dataframe列_R_Dataframe_Rename - Fatal编程技术网

重命名由当前名称引用的多个dataframe列

重命名由当前名称引用的多个dataframe列,r,dataframe,rename,R,Dataframe,Rename,我想重命名大数据框的一些随机列,我想使用当前列名,而不是索引。如果向数据中添加或删除列,列索引可能会更改,因此我认为使用现有列名是一种更稳定的解决方案。 这就是我现在拥有的: mydf = merge(df.1, df.2) colnames(mydf)[which(colnames(mydf) == "MyName.1")] = "MyNewName" 我可以简化这段代码吗?要么是原始的merge()调用,要么就是第二行“MyName.1”实际上是两个不同xts对象的xts合并的结果 nam

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

mydf = merge(df.1, df.2)
colnames(mydf)[which(colnames(mydf) == "MyName.1")] = "MyNewName"
我可以简化这段代码吗?要么是原始的
merge()
调用,要么就是第二行<代码>“MyName.1”实际上是两个不同xts对象的xts
合并的结果

names(mydf)[names(mydf) == "MyName.1"] = "MyNewName" # 13 characters shorter. 

不过,最终可能需要替换向量。在这种情况下,使用%
中的
%而不是
=
,并将MyName.1设置为与MyNewName长度相等的向量
名称(mydf)更改
data.frame
的列名的麻烦在于,几乎令人难以置信的是,整个
data.frame
都被复制了。即使它位于
.GlobalEnv
中,并且没有其他变量指向它

names(mydf) <- sub("MyName\\.1", "MyNewName", names(mydf))
具有一个
setnames()
函数,该函数通过引用更改列名,而不复制整个数据集<代码>数据。表
的不同之处在于它不会在写入时复制,这对于大型数据集非常重要。(您确实说过您的数据集很大。)。只需提供
旧的
新的
名称:

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

plyr
有一个重命名功能用于此目的:

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

mydf您可以使用软件包的
str_replace
功能:


names(mydf)您能提供一个具有所需输出的小型可复制数据集吗?您不需要
其中的
!R接受运算符[]中的布尔值
colnames(mydf)[colnames(mydf)=“MyName.1”]=“MyNewName”
应该可以用<代码>名称(mydf)[名称(mydf)=“MyName.1”]=“MyNewName”
。。。大约缩短13个字符。虽然,在这种情况下,您可能需要替换向量,但请使用%而不是==。@BrandonBertelsen,您能否将您的评论作为答案重新发布?通过这种方式,社区可以看到这个问题正在得到解决,并且你会为此获得一些代表。我认为这不应该被标记为
data.table
,因为这是关于数据帧的(即使下面提到了数据表)。重命名数据表中的列的正确方法是使用
setnames
Heh。对
data.frame
执行几乎任何操作都会遇到这个问题。你可能认为仅仅改变因子水平也会很快,但事实并非如此。(我相信大家都知道。)@DWin。你好我认为
data.table
中的
setattrib()
可以通过引用更改列的级别(在
data.frame中也可以)。显然,我们需要谨慎行事。可能有一个新的
setlevels()
函数,它将更改一个或多个级别(使用与
setnames()
相同的接口)?顺便说一句,
:=
已经通过引用添加了新的因子级别,这在base中很棘手。后面有很多C代码。请注意,您也可以更新名称列表,这是一个方便的代码片段
setnames(dt,names(dt),snakecase::to_snake_case(names(dt))
谢谢,这让我走上了正确的道路。我现在正在做:names(df)[grep(“.1”,names(df))]=c(“AName.Col1”,“AName.Col2”,“AName.Col3”),这个函数现在也包含在
dplyr
包中。
names(mydf) <- str_replace(names(mydf), "MyName.1", "MyNewName")