在数据框的数字中放置点

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 组值。