colnames命令出错:属性[13]的长度必须与向量[12]相同。

3

我试图在数据框中重命名列。然而,当我尝试运行R中的names或colnames命令时,我一直收到以下错误:

Error in names(HourlyTotal)["ZoneElectric"] <- "Meas.Elec" : 
  'names' attribute [13] must be the same length as the vector [12]

这是我想要运行的代码:

names(HourlyTotal)["ZoneElectric"] <- "Meas.Elec"

但如果我使用列数而不是列名,代码就可以正常工作。
names(HourlyTotal)[3] <- "Meas.Elec"

有什么想法为什么会发生这种情况吗?非常感谢任何帮助,因为这已经让我困扰了一段时间。
2个回答

2

当你写 names(HourlyTotal)["ZoneElectric"] 时,你在请求 R 从向量 names(HourlyTotal) 中获取名为 "ZoneElectric" 的元素。

然而,names(HourlyTotal) 是一个未命名的向量。

我猜测/假设你想要的是 names(HourlyTotal) 中值为 "ZoneElectric" 的元素。如果你知道它在向量中的位置,那么你可以使用数字索引,就像你已经发现的那样(即 names(HourlyTotal)[3])。然而,一种更健壮的解决方案是过滤特定的值:

因此,请使用:

names(HourlyTotal)[names(HourlyTotal) == "ZoneElectric"] <- ... 

# Instead of 
#    names(HourlyTotal)["ZoneElectric"] <- ... 

您可以使用data.table包中的setnames函数:

library(data.table)
setnames(HourlyTotal, old="ZoneElectric", new="NewName")

太好了,这个完美地运作了,而且比使用列的数字索引(可能会更改)要更加健壮。我非常感谢您对此的所有评论。在过去的几天里,我在R上遇到了一些障碍,但我认为现在开始有点明白了。 - Daniel Coakely
很高兴听到这个消息。谷歌搜索“R地狱”——一本非常方便(免费?)的书。 - Ricardo Saporta

0

names(HourlyTotal)["ZoneElectric"] 应该返回 NAnames(HourlyTotal) 的结果是一个向量,您可以通过元素编号进行子集。

为什么不使用这样的东西呢?- setnames(dt,"ZoneElectric","Meas.Elec")


1
我在问题中没有看到任何关于数据表的内容。可能你指的是setNames,它有稍微不同的语法。 - joran
@Joran,你的观察是正确的,setnames确实适用于data.frames。 - Ricardo Saporta
1
我同意,但是提供使用问题中未提及的包中的函数来解决问题,这意味着您应该提到需要加载该包,对吧? - joran
我不明白。就像@RicardoSaporta所说,setnames也适用于data.frame。那么data.table在哪里呢? - TheComeOnMan
1
@Codoremifa,Joran所说的(我完全同意)是,如果您建议的解决方案涉及使用特定于包的函数,则应明确说明。 - Ricardo Saporta

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接