【问题标题】:extract specific digits from column of numbers in R从R中的数字列中提取特定数字
【发布时间】:2020-11-05 04:37:28
【问题描述】:

抱歉,如果这是一个重复的问题,我搜索并找不到我正在寻找的具体答案。

我有一个数据框,其中一列是 16 位代码,还有许多其他列。这是一个简化的例子:

code = c("1109619910224003", "1157919910102001", "1539820070315001", "1563120190907002")
year = c(1991, 1991, 2007, 2019)
month = c(02, 01, 03, 09)

dat = as.data.frame(cbind(code,year,month))

dat

> dat
              code year month
1 1109619910224003 1991     2
2 1157919910102001 1991     1
3 1539820070315001 2007     3
4 1563120190907002 2019     9

如您所见,代码包含年、月和日信息。我的数据框中已经有年份和月份的列,但我还需要创建一个日期列,在本例中分别为 24、02、15 和 07。日期始终采用 yyyymmdd 格式,从代码中的第 6 位开始。所以我基本上需要从每个代码中提取第 12 位和第 13 位来创建我的日期列。

然后我需要根据日期信息为一年中的某一天创建另一列,所以我最终得到以下内容:

day = c(24, 02, 15, 07)
dayofyear = c(55, 2, 74, 250)

dat2 = as.data.frame(cbind(code,year,month,day,dayofyear))
dat2

> dat2
              code year month day dayofyear
1 1109619910224003 1991     2  24        55
2 1157919910102001 1991     1   2         2
3 1539820070315001 2007     3  15        74
4 1563120190907002 2019     9   7       250

有什么建议吗?谢谢!

【问题讨论】:

    标签: r


    【解决方案1】:

    您可以利用 R 中的 Date 数据类型来完成所有这些任务。首先,我们将解析出代码的日期部分(字符 6 到 13),并使用 readr::parse_date() 将它们转换为 Date 格式。转换日期后,我们可以简单地访问您想要的所有值,而不是自己计算它们。

    library(tidyverse)
    out <- dat %>% 
      mutate(
          date=readr::parse_date(substr(code, 6, 13), format="%Y%m%d"),
          day=format(date, "%d"),
          month=format(date, "%m"),
          year=format(date, "%Y"),
          day.of.year=format(date, "%j")
        )
    

    (我在这里使用 tidyverse 语法,因为我发现它更快地解决这些类型的问题)

    创建这些列后,我们可以查看更新后的 data.frame out:

                  code year month       date day day.of.year
    1 1109619910224003 1991    02 1991-02-24  24         055
    2 1157919910102001 1991    01 1991-01-02  02         002
    3 1539820070315001 2007    03 2007-03-15  15         074
    4 1563120190907002 2019    09 2019-09-07  07         250
    

    编辑:注意所有新列的输出是character。我们可以在不使用str() 的情况下判断这一点,因为新列中有前导零。为了摆脱这种情况,我们可以执行out &lt;- out %&gt;% mutate_all(as.integer) 之类的操作,或者只是将mutate_all 调用附加到我们现有管道的末尾。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-12-18
      • 2020-12-12
      • 2014-11-16
      • 1970-01-01
      • 1970-01-01
      • 2018-08-30
      • 2021-12-03
      • 2020-06-07
      相关资源
      最近更新 更多