我正在跟進這個答案。我想知道是否有可能洗掉n1字符向量中與公式中的元素部分重疊的部分f1。
例如, in n1,我們看到"timePost-test 1"&"timePost-test 2"與timein部分重疊f1。
因此,在 中desired_output,我們要洗掉"time"它們的一部分。因為其他元素n1與f1(例如time_wk_whn)中的元素完全重疊,所以我們保持它們不變。
我嘗試了以下解決方案,但無法獲得我的desired output(下)。
desired_output在 BASER或 tidyvesrse 中獲得我的可能嗎?
foo <- function(fmla, vec) {
v1 <- all.vars(fmla)
v2 <- setdiff(vec, v1)
v1 <- paste0('^', v1)
v3 <- sub(paste(v1, collapse = "|"), "", v2)
vec[vec %in% v2] <- v3
vec
}
f1 <- gi ~ 0 time:pub_type time_wk_whn time_wk_btw
n1 <- c("time_wk_whn","time_wk_btw",
"timePost-test 1:pub_typejournal","timePost-test 2:pub_typejournal")
#================================ EXAMPLE OF USE:
foo(f1, n1)
# [1] "time_wk_whn" "time_wk_btw"
# [3] "Post-test 1:pub_typejournal" "Post-test 2:pub_typejournal"
desired_output <- c("time_wk_whn","time_wk_btw",
"Post-test 1:journal","Post-test 2:journal")
#== Similarly `f1` and `n1` can contain non-charctor elements (below) but
#== the desired output should remain the same.
f1 <- gi ~ 0 factor(time):pub_type time_wk_whn time_wk_btw
n1 <- c("time_wk_whn","time_wk_btw", "factor(time)Post-test 1:pub_typejournal",
"factor(time)Post-test 2:pub_typejournal")
uj5u.com熱心網友回復:
你的想法有效,但只需要更多的預處理。考慮
foo <- function(fmla, vec) {
v1 <- as.character(attr(terms(fmla), "variables"))[-1L] # Get the terms instead of the variables. This gives you `factor(time)` but not `time`.
v2 <- setdiff(vec, v1)
v1 <- gsub("([\\\\^$.?*| ()[\\]{}])", "\\\\\\1", v1, perl = TRUE) # Escape all special characters
v3 <- gsub(paste(v1, collapse = "|"), "", v2)
vec[vec %in% v2] <- v3
vec
}
輸出
> foo(
gi ~ 0 factor(time):pub_type time_wk_whn time_wk_btw,
c("time_wk_whn","time_wk_btw", "factor(time)Post-test 1:pub_typejournal", "factor(time)Post-test 2:pub_typejournal")
)
[1] "time_wk_whn" "time_wk_btw" "Post-test 1:journal" "Post-test 2:journal"
> foo(
gi ~ 0 time:pub_type time_wk_whn time_wk_btw,
c("time_wk_whn","time_wk_btw", "timePost-test 1:pub_typejournal", "timePost-test 2:pub_typejournal")
)
[1] "time_wk_whn" "time_wk_btw" "Post-test 1:journal" "Post-test 2:journal"
uj5u.com熱心網友回復:
當您附加 時^,您說明它需要是字串的開頭。此外,sub()只會查找第一個匹配項。您將需要使用gsub().
foo <- function(fmla, vec) {
v1 <- all.vars(fmla)
v2 <- setdiff(vec, v1)
v3 <- gsub(paste(v1, collapse = "|"), "", v2)
vec[vec %in% v2] <- v3
vec
}
fmla <- f1 <- gi ~ 0 time:pub_type time_wk_whn time_wk_btw
vec <- n1 <- c("time_wk_whn","time_wk_btw",
"timePost-test 1:pub_typejournal","timePost-test 2:pub_typejournal")
desired_output <- c("time_wk_whn","time_wk_btw",
"Post-test 1:journal","Post-test 2:journal")
x = foo(f1, n1)
# [1] "time_wk_whn" "time_wk_btw" "Post-test 1:journal"
# [4] "Post-test 2:journal"
all.equal(desired_output, x)
# [1] TRUE
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/407623.html
標籤:
上一篇:如果按順序重復多次,則洗掉子字串
