在数据框的数字中放置点
Placing dots in the numbers of a dataframe
我正在使用 R,这就是我的数据的样子,
a <- data.frame(id=c(1,2,2,2,3),icd9=c("0781","00840","8660","7100","25011"))
我想在第二列的四位和五位数字的第 3 位后加一个点。我在 R 中使用 gsub
但没有得到所需的输出。我想要的数据框是:
id icd9
1 078.1
2 008.40
2 866.0
2 710.0
3 250.11
我在努力
gsub('([0-9])', '\1\2\3.\4', a$icd9)
但我得到了
[1] "0.7.8.1." "0.0.8.4.0." "8.6.6.0." "7.1.0.0." "2.5.0.1.1."
提前谢谢大家:)
library(dplyr)
a %>%
mutate(num = as.numeric(paste0(substr(icd9,1,3),".",substr(icd9,4,nchar(icd9)))))
id icd9 num
1 1 0781 78.10
2 2 00840 8.40
3 2 8660 866.00
4 2 7100 710.00
5 3 25011 250.11
如果您的目标是将 ICD9 代码映射到 phecodes,请在您的问题中包含该信息。这个方法可能对你有用:
library(tidyverse)
#remotes::install_github("PheWAS/PheWAS")
library(PheWAS)
#> Loading required package: parallel
#install.packages("fuzzyjoin")
library(fuzzyjoin)
a <- data.frame(id=c(1,2,2,2,3),icd9=c("0781","00840","8660","7100","25011"))
ci_str_detect <- function(x, y) {
str_detect(y, pattern = sub('(?<=.{3})', '.', x, perl = TRUE))
}
fuzzyjoin::fuzzy_left_join(a, phecode_map, by = c("icd9" = "code"), match_fun = ci_str_detect)
#> id icd9 vocabulary_id code phecode
#> 1 1 0781 ICD9CM 078.1 078
#> 2 1 0781 ICD9CM 078.10 078
#> 3 1 0781 ICD9CM 078.11 078
#> 4 1 0781 ICD9CM 078.12 078
#> 5 1 0781 ICD9CM 078.19 078
#> 6 2 00840 <NA> <NA> <NA>
#> 7 2 8660 ICD9CM E866.0 984
#> 8 2 7100 ICD9CM 710.0 695.42
#> 9 3 25011 ICD9CM 250.11 250.11
由 reprex package (v2.0.1)
于 2021-09-21 创建
编辑
“008.40”似乎不是有效的 ICD9 代码。不过,“008.41”是有效的,因此如果您使用它,您不会在第 6 行中获得“NA”值。
你可以使用
sub('^(\d{3})(\d)', '\1.\2', a$icd9)
# => [1] "078.1" "008.40" "866.0" "710.0" "250.11"
参见R demo online and the regex demo。 详情:
使用 sub
是因为每个字符串只有一次搜索和替换操作
^(\d{3})(\d)
将前三位数字(^
是字符串的开头,\d{3}
是三位数字)匹配到第 1 组(由于 (...)
)和下一个数字被捕获到组 2
- 替换为第 1 组 +
.
+ 第 2 组值。
我正在使用 R,这就是我的数据的样子,
a <- data.frame(id=c(1,2,2,2,3),icd9=c("0781","00840","8660","7100","25011"))
我想在第二列的四位和五位数字的第 3 位后加一个点。我在 R 中使用 gsub
但没有得到所需的输出。我想要的数据框是:
id icd9
1 078.1
2 008.40
2 866.0
2 710.0
3 250.11
我在努力
gsub('([0-9])', '\1\2\3.\4', a$icd9)
但我得到了
[1] "0.7.8.1." "0.0.8.4.0." "8.6.6.0." "7.1.0.0." "2.5.0.1.1."
提前谢谢大家:)
library(dplyr)
a %>%
mutate(num = as.numeric(paste0(substr(icd9,1,3),".",substr(icd9,4,nchar(icd9)))))
id icd9 num
1 1 0781 78.10
2 2 00840 8.40
3 2 8660 866.00
4 2 7100 710.00
5 3 25011 250.11
如果您的目标是将 ICD9 代码映射到 phecodes,请在您的问题中包含该信息。这个方法可能对你有用:
library(tidyverse)
#remotes::install_github("PheWAS/PheWAS")
library(PheWAS)
#> Loading required package: parallel
#install.packages("fuzzyjoin")
library(fuzzyjoin)
a <- data.frame(id=c(1,2,2,2,3),icd9=c("0781","00840","8660","7100","25011"))
ci_str_detect <- function(x, y) {
str_detect(y, pattern = sub('(?<=.{3})', '.', x, perl = TRUE))
}
fuzzyjoin::fuzzy_left_join(a, phecode_map, by = c("icd9" = "code"), match_fun = ci_str_detect)
#> id icd9 vocabulary_id code phecode
#> 1 1 0781 ICD9CM 078.1 078
#> 2 1 0781 ICD9CM 078.10 078
#> 3 1 0781 ICD9CM 078.11 078
#> 4 1 0781 ICD9CM 078.12 078
#> 5 1 0781 ICD9CM 078.19 078
#> 6 2 00840 <NA> <NA> <NA>
#> 7 2 8660 ICD9CM E866.0 984
#> 8 2 7100 ICD9CM 710.0 695.42
#> 9 3 25011 ICD9CM 250.11 250.11
由 reprex package (v2.0.1)
于 2021-09-21 创建编辑
“008.40”似乎不是有效的 ICD9 代码。不过,“008.41”是有效的,因此如果您使用它,您不会在第 6 行中获得“NA”值。
你可以使用
sub('^(\d{3})(\d)', '\1.\2', a$icd9)
# => [1] "078.1" "008.40" "866.0" "710.0" "250.11"
参见R demo online and the regex demo。 详情:
-
使用
sub
是因为每个字符串只有一次搜索和替换操作^(\d{3})(\d)
将前三位数字(^
是字符串的开头,\d{3}
是三位数字)匹配到第 1 组(由于(...)
)和下一个数字被捕获到组 2- 替换为第 1 组 +
.
+ 第 2 组值。