R语言用for循环基于日期列唯一值创建计数列报错求助
R for循环实现日期顺序计数报错修复
问题背景
- 练习for循环与if语句用法,明确知晓存在其他更简便的实现方式,仅希望通过循环逻辑完成功能
- 需求:在数据框新增
loop列,对日期列的每个唯一日期按首次出现先后顺序计数,例如日期"2022-05-05"对应值1,"2022-05-06"对应值2,后续日期依次递增 - 初始实现思路:
- 初始化
loop列所有值为0 - 定义空日期变量存储上一个遍历到的唯一日期,定义计数变量初始值为0
- 逐行遍历日期列:当前行日期与存储的日期一致则跳过;不一致则更新存储日期、计数加1,将当前计数赋值给对应行的
loop列
- 初始化
- 运行抛出错误:
Error in 1:nrow(df$b) : argument of length 0
原始错误代码:
a <- rnorm(10) b <- seq(as.Date("2022/05/05"), by = "day", length.out = 10) df <- data.frame(a,b) df <- df[rep(seq_len(nrow(df)), each = 2), ] df$loop <- 0 date <- as.Date(x = integer(0), origin = "1970-01-01") count <- 0 for (x in 1:nrow(df$b)){ if(date==x){ next }else{ date <- x count <- +1 df$loop[x] <- count} }
错误点说明
nrow()仅支持数据框、矩阵类二维结构输入,df$b是一维日期向量,不存在行维度,nrow(df$b)返回NULL,因此触发长度为0的参数报错,遍历行索引应使用nrow(df)获取数据框总行数- 循环内比较逻辑类型不匹配:
x是行索引(整数值),date是日期类型变量,二者无法直接比较,应取当前行的日期值df$b[x]参与比较 - 计数累加写法错误:
count <- +1是将count赋值为1,并非累加,累加正确写法为count <- count + 1 - 初始值与分支逻辑有缺陷:初始
date是空长度日期向量,第一次循环做相等判断时会返回空逻辑值,触发判断报错;且相等分支直接next跳过赋值,会导致重复日期行的loop列一直保留初始值0 - 分支内赋值逻辑遗漏:相同日期的行也需要把当前计数值赋给
loop列,否则同日期行值为0
修复后可运行代码
a <- rnorm(10) b <- seq(as.Date("2022/05/05"), by = "day", length.out = 10) df <- data.frame(a,b) df <- df[rep(seq_len(nrow(df)), each = 2), ] df$loop <- 0 # 初始化为早于所有数据日期的不可能值,避免首次判断报错 date <- as.Date("1970-01-01") count <- 0 for (x in 1:nrow(df)){ current_date <- df$b[x] if(current_date == date){ # 同日期直接赋当前计数值 df$loop[x] <- count }else{ # 新日期更新标记、计数累加 date <- current_date count <- count + 1 df$loop[x] <- count } }
运行后结果符合预期,每个唯一日期对应从1开始递增的整数序号,重复日期序号一致。
内容的提问来源于stack exchange,提问作者Always_learning_new_things
相关产品推荐
相关产品推荐

