如何根据R中其他列的信息创建新列

qvtsj1bj  于 2023-01-22  发布在  其他
关注(0)|答案(2)|浏览(75)

我有一个跨越20年的大型数据集,其中一列是日期,另一列是结束时间(HE),我正尝试添加一个新列来提供给定年份的逐小时(hrxhr)信息(所以是运行总计),所以日期:2023年1月1日,他:1应为hrxhr:1和2023年12月31日,HE:24,应该是hrxhr:8760(闰年为8784)。
应如下所示:
| 年份|月份|日|一天中的小时|月份_编号|日期|日期1|* 新列 * hrxhr|
| - ------|- ------|- ------|- ------|- ------|- ------|- ------|- ------|
| 二○二三|12月|三十一|二十二|十二|二〇二三年十二月三十一日|三六五|小行星8758|
| 二○二三|12月|三十一|二十三|十二|二〇二三年十二月三十一日|三六五|小行星8759|
| 二○二三|12月|三十一|二十四|十二|二〇二三年十二月三十一日|三六五|小行星8760|
| 小行星2024|一月|一|1个|一|2024年1月1日|1个|1个|
| 小行星2024|一月|一|第二章|一|2024年1月1日|1个|第二章|
起初我以为我可以得到儒略日期,然后乘以HE,但这是不正确的,因为2023年1月2日,HE:1将等于2,但hrxhr/运行总数应等于25。

fdx2calv

fdx2calv1#

以R为基数:

df <- data.frame(
    YEAR = c(2023L, 2023L, 2023L, 2024L, 2023L), 
    MONTH = c("Dec", "Dec", "Dec", "Jan", "Jan"), DAY = c(31L, 31L, 31L, 1L, 1L), 
    HOUR_OF_DAY = c(22L, 23L, 24L, 1L, 2L), Month_num = c(12L, 
    12L, 12L, 12L, 12L), Date = c("2023-12-31", "2023-12-31", 
    "2023-12-31", "2024-01-01", "2024-01-01"), Date1 = c(365L, 
    365L, 365L, 1L, 1L))

df$hrxhr <- mapply(\(from, to, by) length(seq.POSIXt(from, to, by)),
       from = trunc(as.POSIXlt(df$Date), "years"), 
        to = as.POSIXlt(df$Date), 
        by="1 hour") + df$HOUR_OF_DAY - 1

df
#>   YEAR MONTH DAY HOUR_OF_DAY Month_num       Date Date1 hrxhr
#> 1 2023   Dec  31          22        12 2023-12-31   365  8758
#> 2 2023   Dec  31          23        12 2023-12-31   365  8759
#> 3 2023   Dec  31          24        12 2023-12-31   365  8760
#> 4 2024   Jan   1           1        12 2024-01-01     1     1
#> 5 2023   Jan   1           2        12 2024-01-01     1     2
q8l4jmvw

q8l4jmvw2#

如果您对tidyverse/lubridate解决方案持开放态度,则可以使用

library(dplyr)
library(lubridate)

df1 %>% 
  mutate(
    begin  = ymd_hms(paste(year(Date), "-01-01 00:00:00")),
    target = ymd_hms(paste(Date,  HOUR_OF_DAY, ":00:00")),
    hrxhr = time_length(interval(begin, target), "hours")) %>% 
  select(-begin, -target)

这将返回

# A tibble: 5 × 7
   YEAR MONTH DAY   HOUR_OF_DAY Month_num Date       hrxhr
  <dbl> <chr> <chr>       <dbl>     <dbl> <date>     <dbl>
1  2023 Dec   31             22        12 2023-12-31  8758
2  2023 Dec   31             23        12 2023-12-31  8759
3  2023 Dec   31             24        12 2023-12-31  8760
4  2024 Jan   01              1        12 2024-01-01     1
5  2024 Jan   01              2        12 2024-01-01     2

数据

structure(list(YEAR = c(2023, 2023, 2023, 2024, 2024), MONTH = c("Dec", 
"Dec", "Dec", "Jan", "Jan"), DAY = c("31", "31", "31", "01", 
"01"), HOUR_OF_DAY = c(22, 23, 24, 1, 2), Month_num = c(12, 12, 
12, 12, 12), Date = structure(c(19722, 19722, 19722, 19723, 19723
), class = "Date")), row.names = c(NA, -5L), class = "data.frame")

相关问题