在R中的列名称中间插入文本

时间:2016-06-11 10:56:42

标签: r string text gsub

我想在"_2010_"的{​​{1}} .之后插入字符串colnames

data.frame

所需的输出

data("iris")

> names(iris)
[1] "Sepal.Length" "Sepal.Width"  "Petal.Length" "Petal.Width"  "Species"  

帮助?

修改 相关问题:现在如何在[1] "Sepal._2010_Length" "Sepal._2010_Width" "Petal._2010_Length" "Petal._2010_Width" "Species" 之前插入字符串"_2010_"

.

3 个答案:

答案 0 :(得分:2)

我们可以使用subnames的'{1}}'iris',其中.(通过grep进行子集化)。在这里,我们使用捕获组((...))并替换为反向引用(\\1)以及新添加的子串(_2010_)。

i1 <- grep("[.]", names(iris))
name(iris)[i1] <- sub("([^.]+.)(.*)", "\\1_2010_\\2", names(iris)[i1])

或者使用单个捕获组,我们匹配一个点(.\\)后跟字符,直到捕获组中字符串的结尾。将其替换为点后跟子串和反向引用。

sub("\\.(.*)", "._2010_\\1", names(iris))
#[1] "Sepal._2010_Length" "Sepal._2010_Width"  "Petal._2010_Length"
#[4] "Petal._2010_Width"  "Species"      

如果我们需要.之前的字符串,只需更改替换中字符串的放置顺序

sub("\\.(.*)", "_2010_.\\1", names(iris))
#[1] "Sepal_2010_.Length" "Sepal_2010_.Width"  "Petal_2010_.Length"
#[4] "Petal_2010_.Width"  "Species"  

答案 1 :(得分:2)

另一种方法是使用strsplitpaste

sapply(strsplit(names(iris), "\\."), paste, collapse = "_2010_")
[1] "Sepal_2010_Length" "Sepal_2010_Width"  "Petal_2010_Length" "Petal_2010_Width"  "Species" 

您可以在任何地方添加一个额外的点:

sapply(strsplit(names(iris), "\\."), paste, collapse = "._2010_")
[1] "Sepal._2010_Length" "Sepal._2010_Width"  "Petal._2010_Length" "Petal._2010_Width"  "Species"

sapply(strsplit(names(iris), "\\."), paste, collapse = "_2010_.")
[1] "Sepal_2010_.Length" "Sepal_2010_.Width"  "Petal_2010_.Length" "Petal_2010_.Width"  "Species"

答案 2 :(得分:1)

str_replace中的函数stringr非常适合此问题,并且非常易于使用。

library(stringr)
str_replace(names(iris), "\\.", "_2010_.")
#[1] "Sepal_2010_.Length" "Sepal_2010_.Width"  "Petal_2010_.Length" 
#[4] "Petal_2010_.Width"  "Species"

如果您想在.之前_,请将"._2010_"放入str_replace的语法中。我们使用\\.而不只是.因为点已经有意义,如果我们想要专门匹配它(http://regexone.com/lesson/wildcards_dot),我们需要转义它。