繁体   English   中英

R数据框正则表达式

[英]R dataframe regular expression

在以下示例数据帧中:

# generate example data frame
data <- data.frame(matrix(data=c("a","b","c","d","e","f"), nrow=70, ncol=5))
data <- apply(data,1, function(x) {paste(x, collapse = " > ")})
data <- data.frame(id=1:length(data), x = data)
data$x <- as.character(data$x)

> head(data)
  id                 x
1  1 a > e > c > a > e
2  2 b > f > d > b > f
3  3 c > a > e > c > a
4  4 d > b > f > d > b
5  5 e > c > a > e > c
6  6 f > d > b > f > d

x列中的某些属性是预先已知的,但并非全部。

已知的属性将被替换为单个名称。 在该示例中,一组已知属性是{“ a”,“ c”,“ f”}。

预先不知道所有不属于此集合的属性,应将其替换为NA

步骤1:替换属性{“ a”,“ c”,“ f”}

# substitute all relevant attributes with according Names
data$x <- gsub("a", "Anton",data$x)
data$x <- gsub("c", "Chris",data$x)
data$x <- gsub("f", "Flo",data$x)

数据框现在如下所示:

> head(data)
  id                                 x
1  1     Anton > e > Chris > Anton > e
2  2             b > Flo > d > b > Flo
3  3 Chris > Anton > e > Chris > Anton
4  4               d > b > Flo > d > b
5  5     e > Chris > Anton > e > Chris
6  6             Flo > d > b > Flo > d

步骤2:将所有{{Anton“,” Chris“,” Flo“}以外的属性替换为NA

这是我需要帮助的地方。

我的想法是利用正则表达式并将{“ Anton”,“ Chris”,“ Flo”,“>”}}中不在的每个值/字符字符串替换为“ NA”。

在我真正的问题中,我不知道值{“ b”,“ d”,“ e”}和属性可以采用长度大于1的任何值或单词。此外,未知集合的值可以转换时间。 因此,如果该函数将在以后的实例中执行,则可能会有新的未知值。

结果:结果数据框应如下所示:

> head(data)
  id                                  x
1  1    Anton > NA > Chris > Anton > NA
2  2           NA > Flo > NA > NA > Flo
3  3 Chris > Anton > NA > Chris > Anton
4  4            NA > NA > Flo > NA > NA
5  5    NA > Chris > Anton > NA > Chris
6  6           Flo > NA > NA > Flo > NA

任何帮助表示赞赏!

你可以尝试mgsubqdap

library(qdap)
data$x <- mgsub(c('a', 'c', 'f', 'd', 'e', 'b'),
      c('Anton', 'Chris', 'Flo', 'NA', 'NA', 'NA'), data$x)
head(data,3)
#  id                                  x
#1  1    Anton > NA > Chris > Anton > NA
#2  2           NA > Flo > NA > NA > Flo
#3  3 Chris > Anton > NA > Chris > Anton

更新资料

假设如果我们只知道要用其他元素“ v3”替换的元素列表(“ v1”),则可以通过删除“ v1”和“ punct”字符中的元素来获得其他元素(“ v2”)带gsub的“ x”列。 使用此信息输入mgsub

v1 <-  c('a', 'c', 'f')
v2 <- unique(scan(text=gsub(paste(c(v1,"[[:punct:]]+"),
    collapse="|"), "", data$x), what='', quiet=TRUE))

v3 <- c('Anton', 'Chris', 'Flo')
data$x <- mgsub(c(v1, v2), c(v3, rep("NA", length(v2))), data$x)
head(data,3)
 #  id                                  x
 #1  1    Anton > NA > Chris > Anton > NA
 #2  2           NA > Flo > NA > NA > Flo
 #3  3 Chris > Anton > NA > Chris > Anton

更新2

您也可以在不使用任何外部软件包的情况下执行此操作

 names(v3) <- v1
 data$x <- sapply(strsplit(data$x, ' > '), function(x)
                 paste(v3[x], collapse=" > "))
 head(data,3)
 #  id                                  x
 #1  1    Anton > NA > Chris > Anton > NA
 #2  2           NA > Flo > NA > NA > Flo
 #3  3 Chris > Anton > NA > Chris > Anton

这种单线将每个单词字符与指定列表的名称进行匹配,并将匹配项替换为与该名称关联的值。 如果没有匹配项,则将NA用作替换值:

library(gsubfn)
data$x <- gsubfn("\\w", list(a = "Anton", c = "Chris", f = "Flo", NA), data$x)

给予:

> head(data)
  id                                  x
1  1    Anton > NA > Chris > Anton > NA
2  2           NA > Flo > NA > NA > Flo
3  3 Chris > Anton > NA > Chris > Anton
4  4            NA > NA > Flo > NA > NA
5  5    NA > Chris > Anton > NA > Chris
6  6           Flo > NA > NA > Flo > NA

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM