如何将特定时间字符串转换为数字变量?

时间:2016-09-16 10:22:57

标签: r string

我有代表年龄的数据,例如8y 10m 27d,其中y为年,m为月,d为天。

我已尝试使用gsub()ymd替换为*365+*30+,并分别取消任何内容,然后使用as.numeric(),但R不知道它应该首先计算,所以它只返回NA。

有没有办法将这种字符串转换为确切的天数?

很抱歉格式化,我不记得上次我在这个网站上所以我忘记了如何格式化。

2 个答案:

答案 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