使用 R 根据条件在字符串末尾添加数字或字符

Add number or character at the end of a string based on condition using R

我有这样的数据:

a <- c("t_1", "t_2", "100", "200")
b <- c(100, 200, 300, 277)

dat <- data.frame(a,b)

我想将第 a 列设为数值变量。我想要的是首先在以 t_ 开头的值的第一个数字后面添加三个 0,然后删除 t_ 并将该列转换为数字数据类型。

结果应该是:

      a     b
  <dbl> <dbl>
1  1000   100
2  2000   200
3   100   300
4   200   277

在删除 t_ 之前添加 0 很重要,因为实际数据集看起来有些不同。

dplyr 解决方案会很好!

这是 readr::parse_number 的方法:

library(dplyr);library(readr);library(stringr)
dat %>%
  mutate(a = case_when(str_detect(a,"t_") ~ parse_number(a) * 1000,
                       TRUE ~ parse_number(a)))
     a   b
1 1000 100
2 2000 200
3  100 300
4  200 277

case_when的好处是很容易添加百万大小写,IE str_detect(a,"m_") ~ parse_number(a) * 1000000

这只是对亲爱的@Ian Campbell 先生建议的稍作修改。我认为 str_pad 函数也可以派上用场:

library(dplyr)
library(stringr)

dat %>%
  mutate(a = ifelse(str_detect(a, "t_"), str_pad(str_remove(a, "t_"), 
                                                 4, "right", "0"), a), 
         a = as.numeric(a))

     a   b
1 1000 100
2 2000 200
3  100 300
4  200 277

我们可以在没有条件语句的情况下做到这一点。在这里,我们使用str_replace来匹配't_',将数字(\d+)捕获为一组((...)),用反向引用(\1替换它) 后跟三个零并转换为 numeric class 和 as.numeric

library(dplyr)
library(stringr)
dat %>% 
  mutate(a = as.numeric(str_replace(a, 't_(\d+)', '\1000'))) 
#     a   b
#1 1000 100
#2 2000 200
#3  100 300
#4  200 277

最节俭的解决方案,似乎是这样的:

library(dplyr)
dat %>% 
  mutate(a = sub('t_(\d+)', '\1000', a),
         a = as.numeric(a))

这里的\1000其实并不是\前面的数字1000而是一种特殊的正则表达式语法,叫做backreference\1,'remembers' pattern参数中括号中的部分,即(\d+),匹配一个或多个连续的数字。反向引用重复这些数字,它后面的三个 000 确实是您要追加的文字三个 0