我想在"_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_"
?
.
答案 0 :(得分:2)
我们可以使用sub
和names
的'{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)
另一种方法是使用strsplit
和paste
:
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),我们需要转义它。