R语言判断data.frame中日期是否为周末:代码问题排查与解决
问题描述
我有如下R语言的data.frame:
dates <- sample(seq(as.Date('1999/01/01'), as.Date('2000/01/01'), by="day"), 12) df <- data.frame(dates) df$week_day <- weekdays(as.Date(df$dates))
我希望判断这些日期是否为周末,尝试了以下代码:
df$weekday <- as.character(df$week_day) for (i in 1:nrow(df)) { if(df$week_day[i] == "Saturday"){ df$Weekend[i] == 1 } else if (df$week_day[i] == "Monday"){ df$Weekend[i] == 1 } }
但这段代码无法正常运行,请问原因是什么?应该如何修正?
代码失效的原因
- 赋值符号用错:代码里用了
==(比较运算符)而非<-/=(赋值运算符),根本没给df$Weekend写入值,只是做了无意义的比较。 - 目标列未初始化:
df$Weekend在循环前没创建,即便R会自动生成列,结合上面的错误也不会有有效内容。 - 逻辑错误:把周一(Monday)当成了周末,实际周末应该是周六(Saturday)和周日(Sunday)。
- 冗余代码:
df$weekday <- as.character(df$week_day)完全多余,weekdays()返回的本身就是字符型,无需二次转换。
修正方案
方案1:修正循环代码
先初始化目标列,替换赋值符号,修正判断逻辑:
# 先初始化Weekend列,默认设为0(非周末) df$Weekend <- 0 for (i in 1:nrow(df)) { if(df$week_day[i] == "Saturday" || df$week_day[i] == "Sunday"){ df$Weekend[i] <- 1 # 用<-完成赋值 } }
方案2:高效向量化操作(推荐)
R的核心优势是向量化运算,完全不需要循环,用%in%直接批量判断:
# 生成0/1标记 df$Weekend <- ifelse(df$week_day %in% c("Saturday", "Sunday"), 1, 0) # 也可以直接生成逻辑值(TRUE/FALSE),后续可按需转数字 df$Weekend <- df$week_day %in% c("Saturday", "Sunday")
特殊情况处理
如果你的R环境是中文 locale,weekdays()会返回中文(比如“星期六”“星期日”),需要把判断条件改成对应中文:
df$Weekend <- ifelse(df$week_day %in% c("星期六", "星期日"), 1, 0)
内容的提问来源于stack exchange,提问作者Henk Straten
相关产品推荐
相关产品推荐

