将名称附加或粘贴到 R 中的列名称
Posted
技术标签:
【中文标题】将名称附加或粘贴到 R 中的列名称【英文标题】:appending or Pasting names to Column names in R 【发布时间】:2011-12-23 02:57:54 【问题描述】:我有一个包含 400 列的制表符分隔文件。现在我想将文本附加到列名。即如果列名是 A 和 B,我希望它将 A 更改为 A.ovca 并将 B 更改为 B。 ctrls。同样,我想将文本(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
请帮帮我
问候 提利潘
【问题讨论】:
【参考方案1】:如果您的 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”。
如果你的变量名不止一个字母,那么很容易扩展;只需查看一下正则表达式。
【讨论】:
或者,在一行中:colnames(dat) <- gsub("([ACX])","\\1.ovca",colnames(dat))
。
@JoshuaUlrich 同意,但该问题有多个模式/替换对可供操作。
@JoshuaUlrich 已编辑以使其更清晰。理想情况下,这将通过一个基于一组模式/替换对应用替换的函数来完成,但我怀疑这对于这些目的来说是矫枉过正的。【参考方案2】:
这个怎么样?您基本上可以使用%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
【讨论】:
【参考方案3】:这是一个使用stringr
包的两个班轮。
nam <- names(mydf)
names(mydf) <- ifelse(nam %in% c('X', 'A', 'Z'),
str_c(nam, '.ovca'), str_c(nam, '.ctrls'))
【讨论】:
以上是关于将名称附加或粘贴到 R 中的列名称的主要内容,如果未能解决你的问题,请参考以下文章