在 R 中迭代时日期转换为数字
Date is converted to numeric when iterating in R
我有一个名为“Date”的数据框“HeatWave”,其 class 是日期,已通过
检查
> class(HeatWave$Date)
[1] "Date"
我想遍历这些日期并检索每个日期的月份
for (i in HeatWave$Date){
month <- format(i, '%m')
}
但这会触发错误
Error in prettyNum(.Internal(format(x, trim, digits, nsmall, width, 3L, :
invalid 'trim' argument
似乎通过这些日期迭代 i 变量可以将 class 更改为数字,如
所示
> class(i)
[1] "numeric"
我怎样才能让它发挥作用?谢谢! :)
问题
您的循环正在将 Date
转换为 numeric
值。这导致 format()
将方法用于 numeric
值,其中 trim
是第一个参数:
for (i in as.Date("2022-04-15")) print(i)
#> [1] 19097
format(19097, "%m")
#> Error in prettyNum(.Internal(format(x, trim, digits, nsmall, width, 3L, : invalid 'trim' argument
由 reprex package (v2.0.1)
于 2022-04-15 创建
循环解决方案
遍历数据帧的索引而不是实际值。
months <- numeric(nrow(HeatWave))
for (i in seq_along(HeatWave$Date)) {
months[i] <- format(HeatWave$Date[i], '%m')
}
months
#> [1] "03" "03" "03" "03" "03" "03" "03" "03" "03" "03"
由 reprex package (v2.0.1)
于 2022-04-15 创建
一个整洁的解决方案
使用 dplyr::mutate()
和 lubridate::month()
可以更轻松地做到这一点:
library(dplyr)
HeatWave %>%
mutate(
month = lubridate::month(Date)
)
#> Date month
#> 1 2022-03-31 3
#> 2 2022-03-30 3
#> 3 2022-03-29 3
#> 4 2022-03-28 3
#> 5 2022-03-27 3
#> 6 2022-03-26 3
#> 7 2022-03-25 3
#> 8 2022-03-24 3
#> 9 2022-03-23 3
#> 10 2022-03-22 3
由 reprex package (v2.0.1)
于 2022-04-15 创建
示例数据
HeatWave <- data.frame(
Date = as.Date("2022-04-01") - 1:10
)
HeatWave
#> Date
#> 1 2022-03-31
#> 2 2022-03-30
#> 3 2022-03-29
#> 4 2022-03-28
#> 5 2022-03-27
#> 6 2022-03-26
#> 7 2022-03-25
#> 8 2022-03-24
#> 9 2022-03-23
#> 10 2022-03-22
这是一个sapply
方法。
下面的第一个 sapply
显示循环获取日期但打印语句输出数字。使用 sapply
,format
语句可以正常工作。
HeatWave <- data.frame(Date = Sys.Date() - 30:0)
sapply(HeatWave$Date, \(i) print(i))
#> [1] "2022-03-16"
#> [1] "2022-03-17"
#> [1] "2022-03-18"
#> [1] "2022-03-19"
#> [1] "2022-03-20"
#> [1] "2022-03-21"
#> [1] "2022-03-22"
#> [1] "2022-03-23"
#> [1] "2022-03-24"
#> [1] "2022-03-25"
#> [1] "2022-03-26"
#> [1] "2022-03-27"
#> [1] "2022-03-28"
#> [1] "2022-03-29"
#> [1] "2022-03-30"
#> [1] "2022-03-31"
#> [1] "2022-04-01"
#> [1] "2022-04-02"
#> [1] "2022-04-03"
#> [1] "2022-04-04"
#> [1] "2022-04-05"
#> [1] "2022-04-06"
#> [1] "2022-04-07"
#> [1] "2022-04-08"
#> [1] "2022-04-09"
#> [1] "2022-04-10"
#> [1] "2022-04-11"
#> [1] "2022-04-12"
#> [1] "2022-04-13"
#> [1] "2022-04-14"
#> [1] "2022-04-15"
#> [1] 19067 19068 19069 19070 19071 19072 19073 19074 19075 19076 19077 19078
#> [13] 19079 19080 19081 19082 19083 19084 19085 19086 19087 19088 19089 19090
#> [25] 19091 19092 19093 19094 19095 19096 19097
month <- sapply(HeatWave$Date, \(i) format(i, "%m"))
month
#> [1] "03" "03" "03" "03" "03" "03" "03" "03" "03" "03" "03" "03" "03" "03" "03"
#> [16] "03" "04" "04" "04" "04" "04" "04" "04" "04" "04" "04" "04" "04" "04" "04"
#> [31] "04"
由 reprex package (v2.0.1)
于 2022-04-15 创建
我有一个名为“Date”的数据框“HeatWave”,其 class 是日期,已通过
检查> class(HeatWave$Date)
[1] "Date"
我想遍历这些日期并检索每个日期的月份
for (i in HeatWave$Date){
month <- format(i, '%m')
}
但这会触发错误
Error in prettyNum(.Internal(format(x, trim, digits, nsmall, width, 3L, :
invalid 'trim' argument
似乎通过这些日期迭代 i 变量可以将 class 更改为数字,如
所示> class(i)
[1] "numeric"
我怎样才能让它发挥作用?谢谢! :)
问题
您的循环正在将 Date
转换为 numeric
值。这导致 format()
将方法用于 numeric
值,其中 trim
是第一个参数:
for (i in as.Date("2022-04-15")) print(i)
#> [1] 19097
format(19097, "%m")
#> Error in prettyNum(.Internal(format(x, trim, digits, nsmall, width, 3L, : invalid 'trim' argument
由 reprex package (v2.0.1)
于 2022-04-15 创建循环解决方案
遍历数据帧的索引而不是实际值。
months <- numeric(nrow(HeatWave))
for (i in seq_along(HeatWave$Date)) {
months[i] <- format(HeatWave$Date[i], '%m')
}
months
#> [1] "03" "03" "03" "03" "03" "03" "03" "03" "03" "03"
由 reprex package (v2.0.1)
于 2022-04-15 创建一个整洁的解决方案
使用 dplyr::mutate()
和 lubridate::month()
可以更轻松地做到这一点:
library(dplyr)
HeatWave %>%
mutate(
month = lubridate::month(Date)
)
#> Date month
#> 1 2022-03-31 3
#> 2 2022-03-30 3
#> 3 2022-03-29 3
#> 4 2022-03-28 3
#> 5 2022-03-27 3
#> 6 2022-03-26 3
#> 7 2022-03-25 3
#> 8 2022-03-24 3
#> 9 2022-03-23 3
#> 10 2022-03-22 3
由 reprex package (v2.0.1)
于 2022-04-15 创建示例数据
HeatWave <- data.frame(
Date = as.Date("2022-04-01") - 1:10
)
HeatWave
#> Date
#> 1 2022-03-31
#> 2 2022-03-30
#> 3 2022-03-29
#> 4 2022-03-28
#> 5 2022-03-27
#> 6 2022-03-26
#> 7 2022-03-25
#> 8 2022-03-24
#> 9 2022-03-23
#> 10 2022-03-22
这是一个sapply
方法。
下面的第一个 sapply
显示循环获取日期但打印语句输出数字。使用 sapply
,format
语句可以正常工作。
HeatWave <- data.frame(Date = Sys.Date() - 30:0)
sapply(HeatWave$Date, \(i) print(i))
#> [1] "2022-03-16"
#> [1] "2022-03-17"
#> [1] "2022-03-18"
#> [1] "2022-03-19"
#> [1] "2022-03-20"
#> [1] "2022-03-21"
#> [1] "2022-03-22"
#> [1] "2022-03-23"
#> [1] "2022-03-24"
#> [1] "2022-03-25"
#> [1] "2022-03-26"
#> [1] "2022-03-27"
#> [1] "2022-03-28"
#> [1] "2022-03-29"
#> [1] "2022-03-30"
#> [1] "2022-03-31"
#> [1] "2022-04-01"
#> [1] "2022-04-02"
#> [1] "2022-04-03"
#> [1] "2022-04-04"
#> [1] "2022-04-05"
#> [1] "2022-04-06"
#> [1] "2022-04-07"
#> [1] "2022-04-08"
#> [1] "2022-04-09"
#> [1] "2022-04-10"
#> [1] "2022-04-11"
#> [1] "2022-04-12"
#> [1] "2022-04-13"
#> [1] "2022-04-14"
#> [1] "2022-04-15"
#> [1] 19067 19068 19069 19070 19071 19072 19073 19074 19075 19076 19077 19078
#> [13] 19079 19080 19081 19082 19083 19084 19085 19086 19087 19088 19089 19090
#> [25] 19091 19092 19093 19094 19095 19096 19097
month <- sapply(HeatWave$Date, \(i) format(i, "%m"))
month
#> [1] "03" "03" "03" "03" "03" "03" "03" "03" "03" "03" "03" "03" "03" "03" "03"
#> [16] "03" "04" "04" "04" "04" "04" "04" "04" "04" "04" "04" "04" "04" "04" "04"
#> [31] "04"
由 reprex package (v2.0.1)
于 2022-04-15 创建