同时更改多个同名,用NA替换数据

时间:2015-02-17 12:29:33

标签: r

我试图重命名数据框的多个列名,其中列包含多个类型,列是因子类。

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

有谁知道为什么会这样?

2 个答案:

答案 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="_" )}

对于一个非常大的数据集,这可能是不可行的,所以如果有人知道如何以另一种方式做到这一点,请发一个答案。

相关问题