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

R 如何将特定的时间字符串转换为数字变量?,r,string,R,String,我有代表年龄的数据,例如8y 10m 27d,其中y是年,m是月,d是天 我尝试使用gsub()分别用*365+、*30+和nothing替换y、m和d,然后使用as.numeric(),但R不知道它应该首先计算,所以它只返回NA 有没有办法将这种字符串转换为确切的天数 很抱歉设置了格式,我不记得上次我在这个网站上是什么时候了,所以我忘记了如何设置格式。我们可以使用gsubfn将“y”、“m”、“d”替换为“*365+”、“*30+”和“*1”,并使用eval(parse(. 或者一个更快的选

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

我尝试使用
gsub()
分别用
*365+
*30+
和nothing替换
y
m
d
,然后使用
as.numeric()
,但R不知道它应该首先计算,所以它只返回NA

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


很抱歉设置了格式,我不记得上次我在这个网站上是什么时候了,所以我忘记了如何设置格式。

我们可以使用
gsubfn
将“y”、“m”、“d”替换为“*365+”、“*30+”和“*1”,并使用
eval(parse(.


或者一个更快的选择是

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

str3解决方案可能取决于起始日期(因为闰年)

解决方案可以是:

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

我如何修改它来处理整个数据集?只需使用for循环或@implicati0n您可以使用
sapply(str1,函数(x)eval(parse(text=x)))
我收到一个错误“解析中出错…输入意外结束”. @akrun@implicati0n我尝试了
str2@implicati0n您是使用相同的
str2
还是原始数据集来表示错误。请检查您的数据集是否有不同的模式等。您可以查看lubridate包,例如。
str1 <-  "8y 10m 27d"
str2 <- c(str1, str1)
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