繁体   English   中英

r for if else 语句中的 for 循环

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM