6

我有一个包含 400 列的制表符分隔文件。现在我想将文本附加到列名。即如果列名是 A 和 B,我希望它将 A 更改为 A.ovca 并将 B 更改为 B.ctrls.Like明智的我想将文本(ovca 和 ctrls)添加到 400 列。一些列名使用 ovca,一些列名使用 ctrls。所有列都是唯一的,包含超过 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

请帮帮我

问候蒂利潘

4

3 回答 3

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”。

如果你的变量名不止一个字母,那么很容易扩展;只需查看一下正则表达式。

于 2011-11-06T16:20:31.970 回答
5

这是使用该stringr包的两个衬垫。

nam <- names(mydf)
names(mydf) <- ifelse(nam %in% c('X', 'A', 'Z'), 
   str_c(nam, '.ovca'),  str_c(nam, '.ctrls'))
于 2011-11-06T20:39:13.050 回答
3

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

> (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
于 2011-11-06T16:29:31.887 回答