我正在处理一个数据集,其列数如下:
icd9code
285.21
593.9
285.21
v04.81
为了运行R comorbidities
包,我需要将它们更改为5位数字,不带小数点。
所以他们需要看起来像这样:
icd9code
28521
59390
28521
v0481
我可以使用什么功能?特别是,如果它只有4位数,我怎么能让它在数字的末尾显示0。另外,如何使用“v”转移数字?
答案 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