我试图重命名数据框的多个列名,其中列包含多个类型,列是因子类。
col1 col2 col3 col4 col5 col6
a b c a b a
1 5 8 2 2 5
以连续的条目为条件:
colnames(df)[which(df[1,]=="b " )]<-"new_colname"
理想地产生类似的东西:
col1 new_colname col3 col4 new_colname.2 col6
a b c a b a
1 5 8 2 2 5
但是当我这样做时,所有重命名的列都将其数据替换为NA,产生:
col1 col2 col3
NA NA NA
NA NA NA
有谁知道为什么会这样?
答案 0 :(得分:1)
假设,数据集列都是&#34;因子&#34; class,将列转换为&#34; character&#34;类。
df[] <- lapply(df, as.character)
如果有前导/滞后空格,请使用str_trim
删除这些空格
library(stringr)
df[] <- lapply(df, str_trim)
根据提到的条件更改列名,并使用make.names
为这些重复的列名创建唯一的名称。
names(df)[df[1,]=='b'] <- 'new_colname'
names(df) <- make.names(names(df), unique=TRUE)
df
# col1 new_colname col3 col4 new_colname.1 col6
#1 a b c a b a
#2 1 5 8 2 2 5
df <- structure(list(col1 = structure(c(2L, 1L), .Label = c("1", "a"
), class = "factor"), col2 = structure(c(2L, 1L), .Label = c("5",
"b"), class = "factor"), col3 = structure(c(2L, 1L), .Label = c("8",
"c"), class = "factor"), col4 = structure(c(2L, 1L), .Label = c("2",
"a"), class = "factor"), col5 = structure(c(2L, 1L), .Label = c("2",
"b"), class = "factor"), col6 = structure(c(2L, 1L), .Label = c("5",
"a"), class = "factor")), .Names = c("col1", "col2", "col3",
"col4", "col5", "col6"), row.names = c(NA, -2L), class = "data.frame")
答案 1 :(得分:0)
最后通过使用for循环命名它们来解决这个问题:
for(i in 1:length(df)){colnames(df)[i]<-paste("df", df[1,i],df[3,i], eval(i) ,sep="_" )}
对于一个非常大的数据集,这可能是不可行的,所以如果有人知道如何以另一种方式做到这一点,请发一个答案。