使用 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
。
我有这样的数据:
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
。