[英]For loop in r for if else statements
早上好,我不太明白我在这里做错了什么,有人可以帮忙吗? 我正在尝试将我的日期时间转换为 r,但我的一些日期是“一月”。 或“八月”。 所以当我尝试将其转换为日期/时间时得到空值。
我的解决方案是用分隔符分隔,抓住月份,重命名月份,将日期重新组合在一起,然后从那里开始。 我无法弄清楚循环并继续获得“七月”。
我的数据框现在分离到 2022 年 7 月 14 日(df$left、df$middle、df$right)
for (month in df$left){
if (df$left == "July")
{df$month <- "July"}
else if (df$left == "Aug.")
{df$month <- "August"
if (df$left == "Sept.")
{df$month <- "September"}
if (df$left == "Oct.")
{df$month <- "October"}
if (df$left == "Nov.")
{df$month <- "November"}
if (df$left == "Dec.")
{df$month <- "Dec."}
if (df$left == "Jan.")
{df$month <- "January"}
if (df$left == "Feb.")
{df$month <- "February"}
if (df$left == "March")
{df$month <- "March"}
if (df$left == "April")
{df$month <- "April"}
if (df$left == "May")
{df$month <- "May"}
if (df$left == "June")
{df$month <- "June"}
if (df$left == "July")
{df$month <- "July"}
if (df$left == "Aug.")
{df$month <- "August"}
}
left middle right Workout.Date Activity.Type
<chr> <chr> <chr> <chr> <chr>
1 July 14, 2022 July 14, 2022 Run
转换日期列Workout.date
并使用lubridate::month
从中提取月份,不带缩写。
示例数据
# A tibble: 89 x 1
Workout.date
<chr>
1 July 14, 2022
2 July 15, 2022
3 July 16, 2022
4 July 17, 2022
5 July 18, 2022
6 July 19, 2022
7 July 20, 2022
8 July 21, 2022
9 July 22, 2022
10 July 23, 2022
# ... with 79 more rows
df %>%
mutate(Workout.date = Workout.date %>%
as.Date("%B %d, %Y"),
left = month(Workout.date, abbr = FALSE, label = TRUE))
# A tibble: 89 x 2
Workout.date left
<date> <ord>
1 2022-07-14 July
2 2022-07-15 July
3 2022-07-16 July
4 2022-07-17 July
5 2022-07-18 July
6 2022-07-19 July
7 2022-07-20 July
8 2022-07-21 July
9 2022-07-22 July
10 2022-07-23 July
# ... with 79 more rows
每个月都可以使用
# A tibble: 4 x 2
# Groups: left [4]
Workout.date left
<date> <ord>
1 2022-07-14 July
2 2022-08-01 August
3 2022-09-01 September
4 2022-10-01 October
您可能需要执行几次传递才能完全转换所有条目。
使用完整的月份名称转换所有日期,然后对于返回 NA 的行尝试转换具有不同格式字符串的那些。
这是使用基础 R 的示例
df <- read.table(header=TRUE, text=" Workout.Date
'Jul. 14, 2022'
'July 15, 2022'
'Jul. 16, 2022'
'Jul. 17, 2022'
'Jul 18, 2022'
'July 19, 2022'
'July 20, 2022'
'July 21, 2022'
'July 22, 2022'")
df$date <- as.Date(df$Workout.Date, format = "%B %e, %Y")
#now try a different format on the rows with NA
#abbreviated followed by .
df$date[is.na(df$date)] <- as.Date(df$Workout.Date[is.na(df$date)], format = "%b. %e, %Y")
#abbreviated no .
df$date[is.na(df$date)] <- as.Date(df$Workout.Date[is.na(df$date)], format = "%b %e, %Y")
lubridate backage 在计算如何解释日期方面相当聪明。 我使用 tidyverse 只是为了轻松格式化和显示列类型。
首先,创建一些测试数据
library(lubridate)
library(tidyverse)
d <- tibble(Workout.Date=c("July 14, 2022", "Jul. 14, 2022",
"September 1, 2021", "Sept. 1, 2021"))
现在,一个单行解决方案:
d %>% mutate(Workout.Date=mdy(Workout.Date))
Workout.Date
<date>
1 2022-07-14
2 2022-07-14
3 2021-09-01
4 2021-09-01
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.