HAVE = data.frame(STUDENT = c(1,1,1,2,2,2,3,3),
                  TIME = c(1,2,3,1,2,3,1,2),
                  SCORE = c(7, NA, NA, 5, NA, 19, NA, 2))

WANT = data.frame(STUDENT = c(1,1,1,2,2,2,3,3),
                  TIME = c(1,2,3,1,2,3,1,2),
                  SCORE = c(7, 12, 17, 5, 10, 19, NA, 2))

我希望通过以下步骤修改SCORE: 如果is.na(SCORE),则取先前的值作为CONCENT,并向其添加5.但只能向下而不是向上.

我试过了,但没有成功,当学生连续有两个NA时,它就不起作用了

HAVE %>% group_by(STUDENT) %>% mutate(WANT = ifelse(is.na(SCORE), lag(SCORE) + 5, SCORE))

推荐答案

您可以使用purrr::accumulate:

library(dplyr)
library(purrr)
HAVE |> 
  mutate(SCORE = accumulate(SCORE, ~ if(is.na(.y)) .x + 5 else .y),
         .by = STUDENT)

#   STUDENT TIME SCORE
# 1       1    1     7
# 2       1    2    12
# 3       1    3    17
# 4       2    1     5
# 5       2    2    10
# 6       2    3    19
# 7       3    1    NA
# 8       3    2     2

或者,在基数R中,有Reduceaccumulate = TRUE:

na_add <- function(col, n = 5){
  Reduce(function(x, y) if(is.na(y)) x + n else y, col, accumulate = TRUE)
}
with(HAVE, ave(SCORE, STUDENT, FUN = na_add))
#[1]  7 12 17  5 10 19 NA  2

R相关问答推荐

在' geom_contour_filled()'中对齐两个gplot的 colored颜色 比例

使用long()在dØr中过滤后获取元素数量

创建重复删除的唯一数据集组合列表

找出疾病消失的受试者

使用gggrassure减少地块之间的空间

R Sapply函数产生的值似乎与for循环方法略有不同

Rplotly中的Sankey Diagram:意外连接&

在R中为马赛克图中的每个字段着色

如何在ggplot图中找到第二轴的比例

将数字转换为分钟和秒

2个Rscript.exe可执行文件有什么区别?

如何将R中数据帧中的任何Nas替换为最后4个值

以相同的方式对每个表进行排序

将一个字符串向量调整为与其他字符串向量完全相同的大小

条形图顶部与其错误条形图不对齐

如何在PDF格式的kableExtra表格中显示管道字符?

在R中,如何将误差条放置在堆叠的每个条上?

如何在反曲线图中更改X标签

如何在R中使用混合GAM模型只对固定的影响因素进行适当的预测?

构建一个6/49彩票模拟系统