[英]Rename columns of R dataframe with tidyselect and regular expression
[英]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
任何幫助表示贊賞!
你可以嘗試mgsub
從qdap
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
您也可以在不使用任何外部軟件包的情況下執行此操作
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.