从整列中的字符串替换小数点

时间:2014-02-18 02:44:08

标签: r formatting decimal transformation digits

我正在处理一个数据集,其列数如下:

icd9code
285.21
593.9
285.21
v04.81

为了运行R comorbidities包,我需要将它们更改为5位数字,不带小数点。

所以他们需要看起来像这样:

icd9code
28521
59390
28521
v0481

我可以使用什么功能?特别是,如果它只有4位数,我怎么能让它在数字的末尾显示0。另外,如何使用“v”转移数字?

3 个答案:

答案 0 :(得分:4)

这是一个矢量化解决方案:

x <- c("285.21", "593.9", "285.21", "v04.81")

substr(gsub("\\.", "", paste0(x, "00000")), 1, 5)
# [1] "28521" "59390" "28521" "v0481"

答案 1 :(得分:3)

它并不是那么漂亮,但它应该适用于所有系统:

x <- scan(text="285.21 593.9 285.21 v04.81", what="character")
#[1] "285.21" "593.9"  "285.21" "v04.81"

res <- gsub("\\.","",x)
mapply(paste0, res, sapply(5-nchar(res),rep,x="0"))

#  28521    5939   28521   v0481 
#"28521" "59390" "28521" "v0481" 

答案 2 :(得分:1)

以下是另一种解决方法,如果有多个列需要替换。 我确信有更好的方法可以做到这一点,但逻辑很明确: 1)拆分每列的字符串 2)检查小数点后的字符数是否相应更换

char <- data.frame(icd9code1 = c("285.21", "593.9", "285.21" ,"v04.81"),
                   icd9code2 = c("285.21", "593.9", "285.21" ,"v04.81"),
                   icd9code3 = c("285.21", "593.9", "285.21" ,"v04.81")
                   )

for(col in 1:dim(char)[2]){
  split_str <- strsplit(char[,col],"\\.")

  for(i in 1:nrow(char)){
    if(nchar(split_str[[i]][2]) == 1){
      char[,col][i] <- paste0(gsub("\\.", "", char[,col][i]),"0")
    } else {
      char[,col][i] <- paste0(gsub("\\.", "", char[,col][i]))
    }
  }
}

# > char
#   icd9code1 icd9code2 icd9code3
# 1     28521     28521     28521
# 2     59390     59390     59390
# 3     28521     28521     28521
# 4     v0481     v0481     v0481