簡體   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