test.dat <- c("abcde", "abcXe", "abcdY", "abcXY", "abYcXY", "abcYX")
test.want <- c("abcde", "abc1Xe", "abcd1Y", "abc1XY", "abYc1XY", "abcY1X")
假設我希望在“X”或“Y”之前添加“1”,并且如果“X”和“Y”都存在,則僅在“X”之前添加。
library(tidyverse)
case_when(
str_detect(test.dat, "X") ~ str_replace(test.dat, "X", "1X"),
str_detect(test.dat, "Y") ~ str_replace(test.dat, "Y", "1Y"),
TRUE ~ as.character(test.dat)
)
這有效,但有沒有更好的方法以簡潔的方式做到這一點?也許在單身str_replace?
如果它是“X”或“Y”,以先到者為準,第二種情況怎么樣?
test.dat <- c("abcde", "abcXe", "abcdY", "abcXY", "abYcXY", "abcYX")
test.want <- c("abcde", "abc1Xe", "abcd1Y", "abc1XY", "ab1YcXY", "abc1YX")
stringr 更可取,但我歡迎任何其他方法。謝謝你。
uj5u.com熱心網友回復:
您可以使用前瞻與(?=X)用于X與(?=Y)供Y,使decission如果有一個X與ifelse和grepl。
test.dat <- c("abcde", "abcXe", "abcdY", "abcXY", "abYcXY")
ifelse(grepl("X", test.dat)
, sub("(?=X)", "1", test.dat, perl=TRUE)
, sub("(?=Y)", "1", test.dat, perl=TRUE))
#[1] "abcde" "abc1Xe" "abcd1Y" "abc1XY" "abYc1XY"
或者
sub("(?=X)|(?=Y)(?!.*X)", "1", test.dat, perl=TRUE)
#[1] "abcde" "abc1Xe" "abcd1Y" "abc1XY" "abYc1XY"
uj5u.com熱心網友回復:
您可以使用
test.dat <- c("abcde", "abcXe", "abcdY", "abcXY", "abYcXY", "abcYX")
sub("^([^XY]*)(Y)([^X]*)$|(.*)(X)", "\\1\\41\\3\\5\\2", test.dat)
# => [1] "abcde" "abc1Xe" "abcd1Y" "abc1XY" "abYc1XY" "abcY1X"
stringr::str_replace(test.dat, "^([^XY]*)(Y)([^X]*)$|(.*)(X)", "\\1\\41\\3\\5\\2")
# => [1] "abcde" "abc1Xe" "abcd1Y" "abc1XY" "abYc1XY" "abcY1X"
請參閱正則運算式演示。
這里,
^([^XY]*)(Y)([^X]*)$-串的開始(^),第1組:任何零個或多個字符以外X和Y(([^XY]*)),第2組:Y((Y)),第3組:比其他任何零個或多個字符X(([^X]*)),結束字串($)|- 或者(.*)- 第 4 組:盡可能多的零個或多個字符(X)- 第 5 組:X字符。
請參閱在線 R 演示。
如果您需要在沒有X或的字串末尾添加 1 Y:
test.dat <- c("abcde", "abcXe", "abcdY", "abcXY", "abYcXY", "abcYX")
sub("^([^XY]*)$", "\\11", sub("^([^XY]*)(Y)([^X]*)$|(.*)(X)", "\\1\\41\\3\\5\\2", test.dat))
library(stringr)
str_replace(str_replace(test.dat, "^([^XY]*)(Y)([^X]*)$|(.*)(X)", "\\1\\41\\3\\5\\2"), "^([^XY]*)$", "\\11")
請參閱此 R 演示。輸出:
[1] "abcde1" "abc1Xe" "abcd1Y" "abc1XY" "abYc1XY" "abcY1X"
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/312509.html
下一篇:為什么我不能轉化為平均這兩個值?
