如何解决在R中使用grepl将值替换为子字符串
跟随data.table
df <- data.table(id=c(1,2,3,4,5),variable=c("250.00","250.13","250.56","250.01","Value1"))
1: 1 250.00
2: 2 250.13
3: 3 250.56
4: 4 250.01
5: 5 Value1
我想用250.
替换以奇数结尾的所有Value1
数字,而用Value2
替换以偶数结尾的其他grepl
。
我试图通过以下方式使用df$variable[grepl('250\\.[0-9]1|3|5',df$variable)] <-'Value1'
df$variable[grepl('250\\.[0-9]0|2|4',df$variable)] <-'Value2'
函数。
250.
但是它将所有Value1
替换为1: 1 Value2
2: 2 Value1
3: 3 Value2
4: 4 Value1
5: 5 Value1
。
如何获得这些结果的最佳方法:
base
在原始数据表中,还有更多值。
可以使用data.table
处理latitude = [50.224832,50.536422,50.847827,51.159044,51.470068]
longitude = [108.873007,108.989510,109.107829,109.228010,109.350097]
density = [.15,.25,.35,.45,.55]
output = [(latitude[i],longitude[i],density[i]) for i in range(len(latitude))]
print(output)
[(50.224832,108.873007,0.15),(50.536422,108.98951,0.25),(50.847827,0.35),(51.159044,109.22801,0.45),(51.470068,109.350097,0.55)]
的解决方案会很棒。
解决方法
原因是您的正则表达式。这是一个真正有助于了解您的正则表达式将匹配的应用程序。 https://spannbaueradam.shinyapps.io/r_regex_tester/
250\\.[0-9]1|3|5
正在搜索250\\.[0-9]1
或3
或5
,由于所有250.x都包含5,因此都是匹配项。
250\\.[0-9][135]
的值将以1、3或5 ***结尾。 []
中的值被视为“或”列表。
***这不是100%正确,该模式将为[135]$
,但它将匹配“ Value1”,因为它以1结尾。
使用stringr
库的另一种方法
library(dplyr)
library(stringr)
df %>%
mutate(variable = str_replace_all(variable,c("250.\\d?[13579]$" = "Value1","250.\\d?[02468]$" = "Value2")))
# id variable
# 1: 1 Value2
# 2: 2 Value1
# 3: 3 Value2
# 4: 4 Value1
# 5: 5 Value1
,
我们也可以使用
library(data.table)
df[grepl('^[0-9]',variable),variable :=
c("Value2","Value1")[(as.integer(sub(".*\\.","",variable)) %% 2)+1]]
df
# id variable
#1: 1 Value2
#2: 2 Value1
#3: 3 Value2
#4: 4 Value1
#5: 5 Value1
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。