在数据框中更改某些列的名称

4
如果我想将从两列到结尾的名称更改,为什么我的命令无效?
fredTable <- structure(list(Symbol = structure(c(3L, 1L, 4L, 2L, 5L), .Label = c("CASACBM027SBOG", 
"FRPACBW027SBOG", "TLAACBM027SBOG", "TOTBKCR", "USNIM"), class = "factor"), 
    Name = structure(1:5, .Label = c("bankAssets", "bankCash", 
    "bankCredWk", "bankFFRRPWk", "bankIntMargQtr"), class = "factor"), 
    Category = structure(c(1L, 1L, 1L, 1L, 1L), .Label = "Banks", class = "factor"), 
    Country = structure(c(1L, 1L, 1L, 1L, 1L), .Label = "USA", class = "factor"), 
    Lead = structure(c(1L, 1L, 3L, 3L, 2L), .Label = c("Monthly", 
    "Quarterly", "Weekly"), class = "factor"), Freq = structure(c(2L, 
    1L, 3L, 3L, 4L), .Label = c("1947-01-01", "1973-01-01", "1973-01-03", 
    "1984-01-01"), class = "factor"), Start = structure(c(1L, 
    1L, 1L, 1L, 1L), .Label = "Current", class = "factor"), End = c(TRUE, 
    TRUE, TRUE, TRUE, FALSE), SeasAdj = c(FALSE, FALSE, FALSE, 
    FALSE, TRUE), Percent = structure(c(1L, 1L, 1L, 1L, 1L), .Label = "Fed", class = "factor"), 
    Source = structure(c(1L, 1L, 1L, 1L, 1L), .Label = "Res", class = "factor"), 
    Series = structure(c(1L, 1L, 1L, 1L, 2L), .Label = c("Level", 
    "Ratio"), class = "factor")), .Names = c("Symbol", "Name", 
"Category", "Country", "Lead", "Freq", "Start", "End", "SeasAdj", 
"Percent", "Source", "Series"), row.names = c("1", "2", "3", 
"4", "5"), class = "data.frame")

然后,为了将第二列的名称更改到末尾,我使用以下命令,但不起作用

names(fredTable[,-1]) = paste("case", 1:ncol(fredTable[,-1]), sep = "")

或者
names(fredTable)[,-1] = paste("case", 1:ncol(fredTable)[,-1], sep = "")

通常情况下,人们想要更改特定列的列名,例如从第二列到末尾、从第2列到第7列等,并将其设置为自己喜欢的名称。


在函数外部使用子集,而不是在函数内部。例如使用names(x)[-1]而不是names(x[-1])。更多信息请参考以下链接:https://dev59.com/12025IYBdhLWcg3wUEOP - Pierre L
@Pierre Lafortune,你能否给我一个完整的答案?我尝试了这个方法,但是出现了错误:Error in 1:ncol(fredTable)[-1] : argument of length 0。然后我尝试了names(fredTable)[-1] = paste("case", 1:ncol(fredTable), sep = ""),结果又出现了错误: Warning message: In names(dfm)[-1] = paste("Fraction", 1:ncol(dfm), sep = "") : number of items to replace is not a multiple of replacement length。 - koskesh kiramtodahanet
1个回答

4

在函数外部通过子集替换特定列名,而不是在 names 函数内部进行替换,这样可以改进你第一次尝试的方法:

> names(fredTable)[-1] <- paste("case", 1:ncol(fredTable[,-1]), sep = "")

解释

如果我们将新名称保存在向量 newnames 中,就可以使用替换函数进行更深入的调查。

#These are the names that will replace the old names
newnames <- paste("case", 1:ncol(fredTable[,-1]), sep = "")

我们应该始终使用以下格式替换特定的列名称:

#The right way to replace the second name only
names(df)[2] <- "newvalue"

#The wrong way
names(df[2]) <- "newvalue"

问题在于你试图创建一个新的列名向量,然后将其赋给数据框。这两个操作需要同时完成才能正确替换。
正确的方法[内部]
我们可以扩展函数调用:
#We enter this:
names(fredTable)[-1] <- newnames

#This is carried out on the inside
`names<-`(fredTable, `[<-`(names(fredTable), -1, newnames)) 

错误的方法 [内部]

替换的内部实现方式如下:

#Wrong way
names(fredTable[-1]) <- newnames

#Wrong way Internal
`names<-`(fredTable[-1], newnames)

请注意,没有`[<-`赋值。子集数据框`fredTable[-1]`不存在于全局环境中,因此不会发生`names<-`的赋值。

太好了!您能否也将其制作成当我们想选择列名称的一部分时,例如第2到7列。这样我们就可以涵盖所有类型的列名称更改,以便以后与其他用户一起使用。我喜欢您的答案并接受了它。因此,请更改它以使其更通用。 - koskesh kiramtodahanet

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