r - 将日期字符串转换为 R 中的天数

标签 r string function dataframe gsub

我有一个数据框,其中有一列表示称为 num_days 的天数,为“0”、“”、“0xY0xM”、“0xM”,我想将其更改为天数。

这就是数据框的样子

| a | b | num_days | d  |
| 2 | 3 | '01Y'    | 99 |
| 2 | 4 |  ""      |  8 |
| 3 | 7 | "01Y02M" | 7  |
| 4 | 1 |  "0"     | 8  |

每年Y代表365天,每月代表30天

| a | b | num_days | d  |
| 2 | 3 |   365    | 99 |
| 2 | 4 |   0      |  8 |
| 3 | 7 |   425    | 7  |
| 4 | 1 |   0      | 8  |

目前这是解决方案:

return_days <- function(x){
  if(x == ""){
      return(0)
  }
  d = gsub("Y", ".", x=x, ignore.case=FALSE, fixed=TRUE)
  d = gsub("M", "" , x=d, ignore.case=FALSE, fixed=TRUE)
  d = strsplit(d, '[.]')
  return( ifelse(length(d[[1]]) == 1, 30*as.numeric(x[[1]][1]), 30* as.numeric(d[[1]][1]) + 365*as.numeric(d[[1]][2]) ) ) 
}

我确信这可以写得更好,不幸的是我还不是 R 向导。任何帮助表示赞赏。谢谢

最佳答案

这是使用 evalsub 的基本 R 方法。我们可以尝试将 Y 替换为 *365,将 M 替换为 *30。这会生成文字算术表达式,其值为天数。然后,我们可以使用 eval() 来计算该表达式。

input <- "01Y02M"
input <- sub("Y", "*365+", input)
input <- sub("M", "*30+", input)
input <- sub("\\+$", "", input)
input
eval(parse(text=input))

[1] "01*365+02*30"
[1] 425

关于r - 将日期字符串转换为 R 中的天数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56159785/

相关文章:

c - 如何打印当前行?

javascript - 如何使用 JS 数组元素来定义对使用参数的函数的调用

javascript - 使用 If 条件不返回函数中的值

r - 如何将包含 S4 对象的大列表写为 CSV 文件?

r - 使用 dplyr 检查满足条件的多行值(不包括日期列属于指定时间段的所有行)

javascript - Shiny 的条件面板 : condition based on class of variable in a dataset

r - 从 R 中的文本文件中提取模式子字符串

python - 使用 [ :, :] crashes python? 填充 numpy 数组

通过 terraform 的 azure 函数 : how to connect to service bus

R 指定点边框颜色与填充和线条不同