我的数据框中有几个标题,如下所示
... Page.Visits ba_rm..Total.Conversions Page.Visits ... aaa.d.s..Total.Conversions
我想摆脱中间部分 aaa.d.s 周围的所有内容, 因此新列名称仅为 aaa_d_s 。这里的规则是保持出现在......中间...(3点和2点)之间的任何东西
如何自动清理数据框中的所有列?
答案 0 :(得分:1)
以下是一个例子:
require(dplyr)
data(iris)
existingDF <- iris
existingDF <- existingDF %>% select("Page Visits : aaa_d_s : Total Conversions" = Sepal.Length)
head(existingDF)
updatedDF <- existingDF %>% setNames(tolower(sub(".*: ([a-z_]+) :.*","\\1","Page Visits : aaa_d_s : Total Conversions")))
head(updatedDF)
输出:
> require(dplyr)
> data(iris)
> existingDF <- iris
> existingDF <- existingDF %>% select("Page Visits : aaa_d_s : Total Conversions" = Sepal.Length)
> head(existingDF)
Page Visits : aaa_d_s : Total Conversions
1 5.1
2 4.9
3 4.7
4 4.6
5 5.0
6 5.4
> updatedDF <- existingDF %>% setNames(tolower(sub(".*: ([a-z_]+) :.*","\\1","Page Visits : aaa_d_s : Total Conversions")))
> head(updatedDF)
aaa_d_s
1 5.1
2 4.9
3 4.7
4 4.6
5 5.0
6 5.4
我的建议是你看看正则表达式在R中是如何工作的。基础文档非常好。
了解更多详情
答案 1 :(得分:0)
您可以将sub
与正确的正则表达式一起使用:
sub(".*: ([a-z_]+) :.*","\\1","Page Visits : aaa_d_s : Total Conversions")
[1] "aaa_d_s"
答案 2 :(得分:0)
我们可以使用str_extract
library(stringr)
str_extract(str1, "(?<=:\\s)[^ ]+")
#[1] "aaa_d_s"
要更新列名,我们可以使用
names(existingDF) <- str_extract(names(existingDF), "(?<=:\\s)[^ ]+")
names(existingDF)
#[1] "aaa_d_s"
str1 <- "Page Visits : aaa_d_s : Total Conversions"
答案 3 :(得分:0)
我找到了一个使用gsub的解决方案:
我删除了前缀
names(raw) <- gsub("\\Page.Visits...", "", names(raw))
并删除结尾部分
names(raw) <- gsub("\\..Total.Conversions", "", names(raw))