如何使用for循环为数据框中连续相同id的行分配标识值?
问题解决:用for循环为数据框添加标识列
原始数据生成代码
id <- c(1,1,2,2,3,3,3,4,4,4,4,4,5,5,5) sample <- c(2010,2010,2011,2012,2013,2012,2013,2013,2014,2015,2014,2015,2015,2015,2015) df <- cbind(id,sample)
需求说明
针对上述代码生成的df,需要新增第三列:
- 若当前行与下一行的
id相同,该列赋值1 - 若当前行是某
id的最后一行(与下一行id不同),该列赋值2
原代码问题分析
你编写的循环代码无法实现需求,问题出在这几点:
seq(df)返回的是数据框的列数(此处为2),循环仅执行2次,没有遍历所有行- 循环到最后一行时,
i+1会超出数据框行数,触发索引越界错误 - 初始时第三列不存在,
df[i,3]+1会因无初始值报错
正确的for循环实现代码
# 将矩阵转换为数据框(cbind默认生成矩阵,数据框更便于列操作) df <- as.data.frame(df) # 初始化第三列,默认赋值为2(对应最后一行的情况) df$flag <- 2 # 循环遍历前nrow(df)-1行,避免最后一行出现越界 for(i in 1:(nrow(df)-1)){ if(df[i, "id"] == df[i+1, "id"]){ df[i, "flag"] <- 1 } }
验证结果
执行上述代码后,打印df会得到预期结果:
id sample flag 1 1 2010 1 2 1 2010 2 3 2 2011 1 4 2 2012 2 5 3 2013 1 6 3 2012 1 7 3 2013 2 8 4 2013 1 9 4 2014 1 10 4 2015 1 11 4 2014 1 12 4 2015 2 13 5 2015 1 14 5 2015 1 15 5 2015 2
内容的提问来源于stack exchange,提问作者ALİ AA
相关产品推荐
相关产品推荐

