对不起,标题很尴尬-非常欢迎提出建议,以更好地表述它...
这与Question 1,Question 2和question 3非常相似。所有这些问题都有一个解决方案,该解决方案将在分隔符(通常是下划线)出现“每最后一次”之后删除,包括在字符串的开头出现时。
我需要将那些在分隔符仅出现一次的字符串保留在字符串的开头。
在示例中,对于x[3]
和x[5]
,我想保留“ -3”和“ -5”。我的第一次尝试保持-5,但不保持-3 ...
x <- c("1 - 2","2-1", "-3", "4", "-5-6")
gsub("(.*)\\-.*$", "\\1", x)
#> [1] "1 " "2" "" "4" "-5"
gsub("\\-[^\\-].*$", "", x)
#> [1] "1 " "2" "" "4" ""
修改 Ronaks当前解决方案适用于前面的示例,但是在定界符之前或之后,除了数字以外的其他字符都失败。
x <- c("1 - 2","2-1", "-3", "4", "-5-6", "-0.6", "20/200", "20/200-3")
stringr::str_match(x, '(-?\\d+)-?')[, 2]
#> [1] "1" "2" "-3" "4" "-5" "-0" "20" "20"
所需的输出
#> [1] "1" "2" "-3" "4" "-5" "-0.6" "20/200" "20/200"
(出于好奇:这是用于转换视敏度数据的表示法的,它告诉我们如何区分图表上的字母。此数据有时可能非常混乱,但通常遵循某种表示法。)
答案 0 :(得分:2)
这似乎可以满足您的要求:
str_extract(x, "(-)?\\d+[.\\d/]*(?=-?)")
[1] "1" "2" "-3" "4" "-5" "-0.6" "20/200" "20/200"
这将匹配一个可选的-
,后跟一个或多个数字,然后是.
或一个数字或/
零次或多次(*
) ({(?= ...)
)左侧的可选-
编辑:
base R
解决方案是这样:
unlist(regmatches(x, gregexpr("^(-)?\\d+[.\\d/]*(?=-?)", x, perl = T)))
[1] "1" "2" "-3" "4" "-5" "-0.6" "20/200" "20/200"
数据:
x <- c("1 - 2","2-1", "-3", "4", "-5-6", "-0.6", "20/200", "20/200-3")
答案 1 :(得分:1)
使用str_match
:
stringr::str_match(x, '(-?\\d+)-?')[, 2]
#[1] "1" "2" "-3" "4" "-5"
这将捕获一个可选的"-"
,后跟一个数字,然后是另一个可选的"-"
。
使用str_extract
:
stringr::str_extract(x, '-?\\d+(?=-?)')
并在基数R中:
sub("(-?\\d+)-?.*", "\\1", x)