R:如何更改字符向量调用的数据帧上的colnames?

时间:2013-11-01 16:44:03

标签: r get character

我有一组数据框,我正在努力改变

上的colnames
for(i in c("ML","HL","MSMS","PEP","MqNormHM","MixHM","RawHM","AbsHM","SepAbsHM")){
  j<-ifelse(i %in% c("ML","HL","MSMS","PEP","MqNormHM"),paste("Rel",i,sep=""),i)
  colnames(get(j))<-paste(i,colnames(get(j)),sep="")
}

给我:

Error in colnames(get(j)) <- paste(i, colnames(get(j)), sep = "") : 
  could not find function "get<-"

ML,HL等是以下形式的单独数据帧:

> head(RelML)
          AA       BB       CC       DD       EE      LL      MM      NN
2684 0.19650       NA       NA       NA       NA      NA      NA      NA
4470      NA       NA       NA       NA       NA 0.35249      NA 0.35797
3619 0.22108 0.098167 0.041080       NA       NA      NA      NA      NA
5422      NA       NA 0.052223       NA       NA      NA      NA      NA
1286      NA       NA       NA       NA 0.019568      NA 0.31137 0.34364
1918      NA       NA       NA 0.026735       NA      NA      NA      NA

并且在所有情况下,数据帧的名称开始是,例如:

> colnames(RelML)
[1] "AA" "BB" "CC" "DD" "EE" "LL" "MM" "NN"

我是RelML数据帧的情况,我希望它最终成为:

> paste("ML",colnames(RelML),sep="")
[1] "MLAA" "MLBB" "MLCC" "MLDD" "MLEE" "MLLL" "MLMM" "MLNN"

我试过用get(colnames(j)),colnames(as.name(j))等等来搞错,但似乎没什么用。 任何帮助将不胜感激。 关心Mads

2 个答案:

答案 0 :(得分:1)

您不能get一次对象和修改其列。您需要将其制作成多个语句来获取,修改和重新分配:

for (i in c("ML","HL","MSMS","PEP","MqNormHM",
            "MixHM","RawHM","AbsHM","SepAbsHM")) {
  j <- ifelse(i %in% c("ML","HL","MSMS","PEP","MqNormHM"),
              paste("Rel", i, sep = ""), i)
  o <- get(j)
  colnames(o) <- paste(i, colnames(o), sep = "")
  assign(j, o, envir = .GlobalEnv)
}

你可以通过以下方式使所有矢量化和更清洁:

z  <- c("ML","HL","MSMS","PEP","MqNormHM")
i  <- c("ML","HL","MSMS","PEP","MqNormHM","MixHM","RawHM","AbsHM","SepAbsHM")
j  <- ifelse(i %in% z, paste0("Rel", i), i)
o1 <- mget(j, envir = .GlobalEnv)
n1 <- lapply(o1, colnames)
n2 <- Map(paste0, i, n1)
o2 <- Map(`colnames<-`, o1, n2)

invisible(list2env(o2, .GlobalEnv))

现在通常的免责声明:不得不依赖get/mgetassign通常是不良做法的标志。您应该将它们存储在列表中,然后使用lapply(和其他人)一起处理它们,而不是在您的环境中有很多类似的对象。

答案 1 :(得分:0)

我认为你正在努力实现这一目标 -

library(data.table)
for(i in c("ML","HL","MSMS","PEP","MqNormHM","MixHM","RawHM","AbsHM","SepAbsHM"))
      {
        j<-ifelse(i %in% c("ML","HL","MSMS","PEP","MqNormHM"),paste("Rel",i,sep=""),i)
        setnames(get(j), paste(i,colnames(get(j)),sep=""))
    }

不同之处仅在于我使用data.table::setnames分配列名。