几个月前,我最终得到了一个最初使用我的输入数据的子语句。它已停止工作,导致我重新检查我的丑陋过程。我讨厌分享它,但它同时完成了几件事:
active$id[grep("CIR",active$description)] <- sub(".*CIR0*(\\d+).*","\\1",active$description[grep("CIR",active$description)],perl=TRUE)
此语句通过查找在description列中嵌入了id的行来创建新的id列。子语句将在“CIR0”后面找到数字并填充id列,如果行的描述中有id。我认识到,在赋值的任一侧嵌入grep子集是无效的。
如果模式不匹配,有没有办法让'sub'替换为NA或为空?我觉得我错过了一些非常简单的东西,但要求社区的帮助。谢谢。
创建id列的结果示例:
| name | id | description |
|------+-----+-------------------|
| a | 343 | Here is CIR00343 |
| b | | Didn't have it |
| c | 123 | What is CIR0123 |
| d | | CIR lacks a digit |
| e | 452 | CIR452 is next |
答案 0 :(得分:1)
library(stringr)
str = "Little_Red_Riding_Hood"
sub(".*(Little).*","\\1",str) # Returns 'Little'
sub(".*(Big).*","\\1",str) # Returns 'Little_Red_Riding_Hood'
str_match(str,".*(Little).*")[1,2] #Returns 'Little'
str_match(str,".*(Big).*")[1,2] # Returns NA
答案 1 :(得分:0)
我认为在这种情况下,您可以尝试使用ifelse()
,即
active$id[grep("CIR",active$description)] <- ifelse(match, replacement, "")
如果匹配,match
应评估为true,replacement
是该元素在这种情况下将被替换的内容。同样,如果match
的计算结果为false,则该元素将替换为空字符串(如果您愿意,则替换为NA
)。