R语言:如何新增y列,使其值为上一行的yend值(首行设0)
解决方案
最简洁高效的方法是用dplyr的lag()函数,它专门用来获取向量的前一行值,完全匹配你的需求:
library(dplyr) df <- data.frame( category = c(1,2,3,4,5), yend = c(13, 15, 4, 18, 6), stringsAsFactors = FALSE) df_test <- df |> mutate(y = lag(yend, default = 0))
运行后得到的结果就是你要的:
category yend y 1 1 13 0 2 2 15 13 3 3 4 15 4 4 18 4 5 5 6 18
为什么这个方法可行:
lag(yend)会为每一行提取yend列的上一行值,第一行没有上一行,默认返回NA- 通过
default = 0把第一行的NA替换成0,正好对应category=1的情况 - 这个方法不依赖
category的具体数值,只要数据是按你需要的顺序排列的就可以用,通用性很强
补充另一种依赖category数值的方法(不推荐)
如果你一定要基于category的数值来取前一个值,也可以这么写,但只适用于category是连续整数的情况:
df_test <- df |> mutate(y = ifelse(category == 1, 0, yend[category - 1]))
但这种方法局限性大,如果category不是连续数字或者起始值不是1,就会出错,所以优先用lag()的方案。
内容的提问来源于stack exchange,提问作者msug
相关产品推荐
相关产品推荐

