【问题标题】:Dropping partially overlapping parts of 2 vectors in R在 R 中删除 2 个向量的部分重叠部分
【发布时间】:2022-01-01 21:24:52
【问题描述】:

我想知道是否可以删除n1 字符向量中与f1 公式中的元素部分重叠的部分。

例如,在n1 中,我们看到"chyes"&"bmi:chyes"ch 中的ch 部分重叠。

因此在desired_output 中,我们想要删除其中的"ch" 部分。因为n1 中的其他元素要么与f1 中的元素完全重叠(例如bmi),要么在f1 中不存在(例如intrcpt),我们将它们保持不变。

我尝试了以下解决方案,但无法获得所需的输出。

是否可以在 BASE R 或 tidyvesrse 中获取我的 desired_output

f1 <- yi~ bmi*ch

n1 <- c("intrcpt","bmi","chyes","bmi:chyes")

desired_output <- c("intrcpt","bmi","yes","bmi:yes")

### Current unsuccessful solution:
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 
}
### EXAMPLE OF USE:
foo(f1, n1)
# "intrcpt"   "bmi"       "chyes"     "bmi:chyes"

【问题讨论】:

  • 你不能单独拥有yes。您必须确定 yes 来自的变量,即 ch 变量。除非你使用数值变量
  • 你为什么要这样做?你的最终目标是什么?似乎这是一个中间过程。你最后想做什么?添加/删除条款??
  • 最后你能给出产生n1向量的数据吗?
  • @Onyambu,这是一个可重现的编程问题。我很欣赏编程答案。
  • 你的最终目标是什么?我看到你就公式提出了多个问题。你可能做错了什么。中间步骤可能是不必要的,毕竟可能不受欢迎。可能有一个功能可以将您所拥有的东西转变为最终目标,而无需您经历的步骤

标签: r regex string character


【解决方案1】:

这个函数可以满足你的需要,但我同意@Onyambu 的观点,即值得考虑你的潜在问题是否真的需要字符串操作。

f <- function(fm, nm) {
  vars <- vapply(attr(terms(fm), "variables"), deparse, "")[-1L]
  subpat <- paste0(gsub("([()])", "\\\\\\1", vars), collapse = "|")
  l <- rapply(strsplit(nm, ":"), sub, how = "list",
              perl = TRUE,
              pattern = sprintf("^(?!(%1$s)$)(%1$s)(.+)$", subpat),
              replacement = "\\3")
  vapply(l, paste0, "", collapse = ":")
}

fm1 <- yi ~ bmi * ch
nm1 <- c("intrcpt", "bmi", "chyes", "bmi:chyes")
f(fm1, nm1)
[1] "intrcpt" "bmi"     "yes"     "bmi:yes"
fm2 <- yi ~ bmi * factor(ch)
nm2 <- c("intrcpt", "bmi", "factor(ch)yes", "bmi:factor(ch)yes")
f(fm2, nm2)
[1] "intrcpt" "bmi"     "yes"     "bmi:yes"
fm3 <- gi ~ 0 + time:pub_type + time_wk_whn + time_wk_btw
nm3 <- c("time_wk_whn", "time_wk_btw", "timePost-test 1:pub_typejournal", "timePost-test 2:pub_typejournal")
f(fm3, nm3)
[1] "time_wk_whn"         "time_wk_btw"        
[3] "Post-test 1:journal" "Post-test 2:journal"

【讨论】:

  • 我已经更新了答案,但我可以想象它仍然失败的边缘情况。例如,不可能知道字符串"x:y" 是指两个变量xy 之间的交互,还是指一个非语法命名的变量`x:y`。这就是为什么在字符串级别对语言进行操作通常是不好的做法。
  • 亲爱的 Mikael,在以下示例中,您的 f() 函数似乎错误地将 time 丢弃在其输出中:f1 &lt;- gi ~ 0 + time:pub_type + time_wk_whn + time_wk_btw ; n1 &lt;- c("time_wk_whn","time_wk_btw","timePost-test 1:pub_typejournal","timePost-test 2:pub_typejournal") ; f(f1,n1)。在这种情况下,所需的输出是:desired_output &lt;- c("time_wk_whn","time_wk_btw","Post-test 1:journal","Post-test 2:journal")。有什么解决办法吗?
  • @SimonHarmel 是的,这是一个错误。现已修复。
猜你喜欢
  • 1970-01-01
  • 2022-09-27
  • 2022-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-16
  • 2021-12-30
  • 1970-01-01
相关资源
最近更新 更多