将名称附加或粘贴到R中的列名称

时间:2011-11-06 16:15:53

标签: r append paste columnname

我有一个包含400列的制表符分隔文件。现在我想将文字附加到列名称。如果列名是A和B,我希望它将A更改为A.ovca而B更改为B. ctrls.Like明智的我想要将文本(ovca和ctrls)添加到400个coulmns.Some列名称与ovca和一些ctrls.All列是唯一的,包含超过1000行。给出了delim文件的示例代码下面:

         X             Y         Z               A       B               C  
        2.34          .89       1.4             .92     9.40            .82
        6.45          .04       2.55            .14     1.55            .04
        1.09          .91       4.19            .16     3.19            .56
        5.87          .70       3.47            .80     2.47            .90

我希望文件看起来像:

       X.ovca     Y.ctrls      Z.ctrls       A.ovca     B.ctlrs       C.ovca  
        2.34          .89       1.4             .92     9.40            .82
        6.45          .04       2.55            .14     1.55            .04
        1.09          .91       4.19            .16     3.19            .56
        5.87          .70       3.47            .80     2.47            .90

请帮帮我

此致 Thileepan

3 个答案:

答案 0 :(得分:6)

如果您调用data.frame dat,则可以使用colnames(dat)访问(并写入)列名称。

因此:

cn <- colnames(dat)
cn <- sub("([AXC])","\\1.ovca",cn)
cn <- sub("([YZB])","\\1.ctrls",cn)
colnames(dat) <- cn

> cn
[1] "X.ovca"  "Y.ctrls" "Z.ctrls" "A.ovca"  "B.ctrls" "C.ovca" 

\\1在正则表达式中称为反向替换。它将用模式中括号内的任何内容替换\\1。由于在括号内你有一个括号,它将匹配里面的任何字母。在这种情况下,“A”变为“A.ovca”,“X”变为“X.ovca”。

如果您的变量名称不止一个字母,则很容易扩展;只是看一下正则表达式。

答案 1 :(得分:5)

这是使用stringr包的两个班轮。

nam <- names(mydf)
names(mydf) <- ifelse(nam %in% c('X', 'A', 'Z'), 
   str_c(nam, '.ovca'),  str_c(nam, '.ctrls'))

答案 2 :(得分:3)

这个怎么样?您基本上可以使用%in%找到要附加“ovca”和“ctrls”的列,并附加相应的标记。

> (mydf <- data.frame(X = runif(10), Y = runif(10), Z = runif(10), A = runif(10), B = runif(10), C = runif(10)))
            X         Y         Z         A         B         C
1  0.81030594 0.1624974 0.3977381 0.9619541 0.9866498 0.4424760
2  0.92498687 0.2069429 0.6065115 0.9969835 0.2407364 0.2455184
3  0.11033869 0.2878640 0.5662793 0.7936232 0.6066735 0.8210634

> names(mydf)[names(mydf) %in% c("X", "A", "C")] <- paste(names(mydf)[names(mydf) %in% c("X", "A", "C")], "ovca", sep = ".")
> names(mydf)[names(mydf) %in% c("Y", "Z", "B")] <- paste(names(mydf)[names(mydf) %in% c("Y", "Z", "B")], "ctrls", sep = ".")
> mydf
       X.ovca   Y.ctrls   Z.ctrls    A.ovca   B.ctrls    C.ovca
1  0.81030594 0.1624974 0.3977381 0.9619541 0.9866498 0.4424760
2  0.92498687 0.2069429 0.6065115 0.9969835 0.2407364 0.2455184
3  0.11033869 0.2878640 0.5662793 0.7936232 0.6066735 0.8210634