我有代表年龄的数据,例如8y 10m 27d
,其中y
为年,m
为月,d
为天。
我已尝试使用gsub()
将y
,m
和d
替换为*365+
,*30+
,并分别取消任何内容,然后使用as.numeric()
,但R不知道它应该首先计算,所以它只返回NA。
有没有办法将这种字符串转换为确切的天数?
很抱歉格式化,我不记得上次我在这个网站上所以我忘记了如何格式化。
答案 0 :(得分:1)
我们可以使用gsubfn
替换' y'' m'' d'使用" * 365 +"," * 30 +"和" * 1"并使用eval(parse(.
library(gsubfn)
eval(parse(text=gsubfn("[a-z]", list(y= "* 365 + ", m = "* 30 + ", d = "* 1"), str1)))
#[1] 3247
或者更快的选择是
c(matrix(scan(text=sub(",$", "", gsub("\\D+", ",", str2)), sep=",",
what=numeric(), quiet=TRUE), ncol=3, byrow=TRUE) %*% c(365, 30, 1))
#[1] 3247 3247
如果数据集中有不同的模式,我们可以尝试
str3 <- c(str1, "7m 28d", "5y 10d", "15d", "29d", "8y 15d 10m" )
colSums(sapply(strsplit(str3, "\\s+"), function(x) {
x1 <- as.numeric(sub("\\D+", "", x))
x2 <- sub("\\d+", "", x)
x1[match(c("y", "m", "d"), x2)]}) * c(365, 30, 1), na.rm = TRUE)
#[1] 3247 238 1835 15 29 3235
str1 <- "8y 10m 27d"
str2 <- c(str1, str1)
答案 1 :(得分:0)
解决方案可能取决于起源日期(因为闰年)
解决方案可以是:
str="8y 10m 27d"
str2=gsub("[A-z]","",str)
str3=as.numeric(strsplit(str2, " ")[[1]])
date1=origin=as.POSIXlt("1990-01-01")
date1$year=date1$year+str3[1]
date1$mon=date1$mon+str3[2]
date1$mday=date1$mday+str3[3]
date1-origin
#[1] Time difference of 3253 days