How to rename a single column in a data.frame?
我知道如果我有一个多于一列的数据框,我可以使用
1 | colnames(x) <- c("col1","col2") |
重命名列。 如果只有一栏,该怎么办?
表示其中仅包含一列的向量或数据帧。
例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | trSamp <- data.frame(sample(trainer$index, 10000)) head(trSamp ) # sample.trainer.index..10000. # 1 5907862 # 2 2181266 # 3 7368504 # 4 1949790 # 5 3475174 # 6 6062879 ncol(trSamp) # [1] 1 class(trSamp) # [1]"data.frame" class(trSamp[1]) # [1]"data.frame" class(trSamp[,1]) # [1]"numeric" colnames(trSamp)[2] <-"newname2" # Error in names(x) <- value : # 'names' attribute [2] must be the same length as the vector [1] |
这是一种通用的方式,您不必记住变量的确切位置:
1 2 3 4 5 | # df = dataframe # old.var.name = The name you don't like anymore # new.var.name = The name you want to get names(df)[names(df) == 'old.var.name'] <- 'new.var.name' |
此代码几乎可以执行以下操作:
1 | colnames(trSamp)[2] <-"newname2" |
尝试设置第二列的名称。您的对象只有一列,因此该命令将引发错误。这应该足够了:
1 | colnames(trSamp) <-"newname2" |
1 | colnames(df)[colnames(df) == 'oldName'] <- 'newName' |
这是一个古老的问题,但是值得注意的是,您现在可以使用
1 2 3 4 5 6 7 8 9 10 | library(data.table) setnames(DF,"oldName","newName") # or since the data.frame in question is just one column: setnames(DF,"newName") # And for reference's sake, in general (more than once column) nms <- c("col1.name","col2.name", etc...) setnames(DF, nms) |
这也可以使用Hadley的
1 2 3 | library(plyr) df <- data.frame(foo=rnorm(1000)) df <- rename(df,c('foo'='samples')) |
您可以按名称重命名(不知道位置),并一次执行多个重命名。例如,进行合并后,您可能会得到以下结果:
1 2 3 4 5 6 7 | letterid id.x id.y 1 70 2 1 2 116 6 5 3 116 6 4 4 116 6 3 5 766 14 9 6 766 14 13 |
然后您可以使用以下步骤一步重命名:
1 2 3 4 5 6 7 8 9 | letters <- rename(letters,c("id.x" ="source","id.y" ="target")) letterid source target 1 70 2 1 2 116 6 5 3 116 6 4 4 116 6 3 5 766 14 9 6 766 14 13 |
我认为重命名列的最佳方法是使用dplyr包,如下所示:
1 2 | require(dplyr) df = rename(df, new_col01 = old_col01, new_col02 = old_col02, ...) |
重命名任何数据集中的一列或多列的工作原理相同。
我喜欢一种用于逐一重命名数据框列名称的样式。
1 | colnames(df)[which(colnames(df) == 'old_colname')] <- 'new_colname' |
哪里
1 | which(colnames(df) == 'old_colname') |
通过特定列的索引返回。
我发现重命名单个列的最便捷方法是使用
1 2 3 4 5 6 7 8 9 10 11 12 | library(dplyr) cars %>% rename_at("speed",~"new") %>% head cars %>% rename_at(vars(speed),~"new") %>% head cars %>% rename_at(1,~"new") %>% head # new dist # 1 4 2 # 2 4 10 # 3 7 4 # 4 7 22 # 5 8 16 # 6 9 10 |
- 在管道链中效果很好
- 名称存储在变量中时很方便
- 使用名称或列索引
- 清晰紧凑
您可以在
1 2 | library(gdata) df <- rename.vars(df, from ="oldname", to ="newname") |
如果您要更改多个变量名,或者想要在变量名后添加或添加一些文本,则可以执行以下操作:
1 2 | df <- rename.vars(df, from = c("old1","old2","old3", to = c("new1","new2","new3")) |
有关将文本附加到变量名称的子集的示例,请参见:
https://stackoverflow.com/a/28870000/180892
尝试:
1 | colnames(x)[2] <- 'newname2' |
这可能已经存在了,但是我在寻找解决方案并一时兴起时在重命名字段。为我的目的而工作。
1 2 | Table1$FieldNewName <- Table1$FieldOldName Table1$FieldOldName <- NULL |
编辑从这里开始。
这也可以。
1 | df <- rename(df, c("oldColName" ="newColName")) |
您也可以尝试从" Hmisc"包中获取" upData"。
如果您知道数据框只有一列,则可以使用:
1 2 | library(dplyr) rename(data, de=de.y) |
我只需将一个新列添加到具有所需名称的数据框中,然后从现有列中获取数据即可。像这样:
1 | dataf$value=dataf$Article1Order |
然后我删除旧列!像这样:
1 | dataf$Article1Order<-NULL |
这段代码看起来很愚蠢!但是效果很好...
OP的问题得到了很好的回答。但是,此方法在某些情况下可能有用:列名的部分匹配,无论其在数据帧中的位置如何:
名称部分匹配:
1 2 3 4 5 6 | d <- data.frame(name1 = NA, Reported.Cases..WHO..2011. = NA, name3 = NA) ## name1 Reported.Cases..WHO..2011. name3 ## 1 NA NA NA names(d)[grepl("Reported", names(d))] <-"name2" ## name1 name2 name3 ## 1 NA NA NA |
另一个示例:在存在"标点符号"的情况下进行部分匹配:
1 2 3 4 5 6 | d <- data.frame(name1 = NA, Reported.Cases..WHO..2011. = NA, name3 = NA) ## name1 Reported.Cases..WHO..2011. name3 ## 1 NA NA NA names(d)[grepl("[[:punct:]]", names(d))] <-"name2" ## name1 name2 name3 ## 1 NA NA NA |
这些是我今天必须处理的示例,我认为可能值得分享。
我只需使用以下代码将列名更改为具有我想要的新名称的数据集:
名称(数据集)[index_value] <-" new_col_name"