后续:消除R中2个向量的部分重叠部分

Follow-up: Eliminating partially overlapping parts of 2 vectors in R

我想删除 n1 字符向量中 部分(不完全)与 中的元素重叠的部分 f1 公式.

例如,在 n1 中,我们看到 "study_typecompare" & "study_typecontrol"f1 中的 study_type 部分重叠。

因此在desired_output中,我们要删除其中的"study_type"部分。因为 n1 中的其他元素(例如 factor(v_gi))与 f1 中的元素完全重叠或在 f1 中不存在(例如 intrcpt),我们保持不变。

是否可以在 BASE R 或 tidyvesrse 中获取我的 desired_output(下图)?

我尝试了以下方法,但它从 factor(v_gi):

中错误地删除了 v_gi
f1 <- gi ~ factor(v_gi) + study_type
n1 <- c("intrcpt","factor(v_gi)","study_typecompare","study_typecontrol")


fun1 <- function(fmla, vec) {
  
  v1 <- all.vars(fmla)
  v2 <- setdiff(vec, v1)
  v3 <- sub(paste(v1, collapse = "|"), "", v2)
  vec[vec %in% v2] <- v3
  vec
}
# EXAMPLE OF USE:
fun1(f1, n1)
# Current Output:
[1] "intrcpt"  "factor()" "compare"  "control"  ## Notice `factor()` has errounousely lost its`v_gi`

desired_output = c("intrcpt","factor(v_gi)","compare","control") 

setdiff 行之后,paste 一个 ^ 作为字符串的前缀,所以在 sub 中它只匹配开头。

fun1 <- 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
}

fun1(f1, n1)
# [1] "intrcpt"      "factor(v_gi)" "compare"      "control"