我希望按照某些規則以矢量化方式將字串的一部分包裝在 R 中。
簡單地說,如果我有一個向量:
c("x^2", "x^2:z", "z", "x:z", "z:x:b", "z:x^2:b")
該函式將掃描每個元素并環繞I()那些有指數的部分,從而產生以下輸出:
c("I(x^2)", "I(x^2):z", "z", "x:z", "z:x:b", "z:I(x^2):b")
我嘗試了各種方法,我首先用 : 然后 gsub 分割,但這不是特別可擴展。
uj5u.com熱心網友回復:
像下面這樣的?
> gsub("(x(\\^\\d ))", "I(\\1)", c("x^2", "x^2:z", "z", "x:z", "z:x:b", "z:x^2:b"))
[1] "I(x^2)" "I(x^2):z" "z" "x:z" "z:x:b"
[6] "z:I(x^2):b"
uj5u.com熱心網友回復:
這些看起來相當一般。他們不假設復雜欄位中的變數必須命名, x但處理任何由單詞字符組成的名稱,也不假設算術運算式必須是指數運算式,但處理任何包含非單詞字符的算術運算式。例如,它們會y pi用 I(...)包圍。
1)這一個 liner 捕獲每個欄位并使用指定的函式對其進行處理,以公式表示法表示。它用 I(...) 圍繞每個包含非單詞字符的欄位。它適用于名稱由單詞字符組成的任何變數。
library(gsubfn)
gsubfn("[^:] ", ~ if (grepl("\\W", x)) sprintf("I(%s)", x) else x, s)
## [1] "I(x^2)" "I(x^2):z" "z" "x:z" "z:x:b"
## [6] "z:I(x^2):b"
2)這圍繞包含不是 :、字母或數字的字符的任何欄位和 I(...)
gsub("([^:]*[^:[:alnum:]][^:]*)", "I(\\1)", s)
## [1] "I(x^2)" "I(x^2):z" "z" "x:z" "z:x:b"
## [6] "z:I(x^2):b"
3)在這個替代方案中,我們在冒號處拆分字串,然后用 I(...) 將包含非單詞字符的欄位包圍起來,然后將它們重新粘貼在一起。
surround <- function(x) ifelse(grepl("\\W", x), sprintf("I(%s)", x), x)
s |>
strsplit(":") |>
sapply(function(x) paste(surround(x), collapse = ":"))
## [1] "I(x^2)" "I(x^2):z" "z" "x:z" "z:x:b"
## [6] "z:I(x^2):b"
筆記
使用的輸入如下:
s <- c("x^2", "x^2:z", "z", "x:z", "z:x:b", "z:x^2:b")
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/350597.html
