在R语言dataframe中使用UDF为香港/澳门行的日期加6小时问题求助
R代码问题排查与修复
代码存在的问题
- 语法错误:if判断语句中
country = 'Macau'是赋值操作,不是相等判断,需改为country == 'Macau',这是代码无法正常运行的核心原因。 - 隐式类型转换问题:apply对数据框按行操作时会先将整个数据框转换为字符矩阵,所有数据类型统一转为字符串,多分支返回的结果格式不统一,很容易出现隐式转换异常。
- 性能问题:按行遍历的写法在数据量较大时效率极低,R更适合用向量化操作处理这类需求。
- 鲁棒性问题:通过索引
dataf[2]、dataf[3]取列值,一旦数据框列顺序发生变化就会逻辑出错,用列名取值更稳妥。
兼容原有写法的修复代码
library(lubridate) # 提前统一转换时间格式,避免循环内重复计算 df$indate <- as_datetime(df$indate) hour_addition = function(row) { country = row[["country"]] date = row[["indate"]] # 用%in%简化多值判断,避免重复写判断条件出错 if (country %in% c('Hong Kong', 'Macau')){ date1 = date + dhours(6) } else { date1 = date } return (as.character(date1)) } new_date = apply(df, 1, hour_addition) df$indate1 = new_date
更推荐的向量化写法(无需自定义函数,性能提升明显)
library(lubridate) library(dplyr) df <- df %>% mutate(indate = as_datetime(indate), indate1 = if_else(country %in% c("Hong Kong", "Macau"), indate + dhours(6), indate) %>% as.character())
如果后续还要对indate1做时间计算,可以去掉as.character(),保留时间格式即可。
内容的提问来源于stack exchange,提问作者vik
相关产品推荐
相关产品推荐

