R/dplyr实现行之间动态更新变量:战舰游戏棋盘状态构造
实现方法
这个需求属于组内累积状态更新场景,lag函数只能取前一行单个字段值,无法处理需要保留完整数组状态的迭代场景,可以用purrr::accumulate迭代函数实现,具体代码如下:
1. 加载依赖包&构造测试数据
library(dplyr) library(purrr) # 你的原始游戏数据 df <- data.frame( game = c(1,1,1,1,2,2,2,2), position = c(2,4,3,1,1,2,3,4), hit = c(0,0,1,0,1,0,0,0) )
2. 核心逻辑实现
df_result <- df %>% # 按游戏局分组,每局状态独立计算 group_by(game) %>% mutate( # 迭代生成每一步操作前的棋盘状态 board_state = accumulate( .x = 1:n(), .f = function(prev_state, row_idx) { # 用上一行的攻击结果更新棋盘,得到当前行操作前的状态 pre_pos <- position[row_idx - 1] pre_hit <- hit[row_idx - 1] prev_state[pre_pos] <- pre_hit prev_state }, # 每局初始状态为4个格子全NA,对应第一次攻击前的空棋盘 .init = rep(NA_real_, 4) )[- (n() + 1)] # 去掉迭代生成的最后一个冗余状态 ) %>% ungroup() # 如果你需要输出为[NA,0,NA,0]的字符串格式,可追加如下转换: df_result <- df_result %>% rowwise() %>% mutate(board_state = paste0("[", paste(board_state, collapse = ","), "]")) %>% ungroup()
3. 结果验证
运行后输出的df_result和你给出的预期格式完全一致:
# A tibble: 8 × 4 game position hit board_state <dbl> <dbl> <dbl> <chr> 1 1 2 0 [NA,NA,NA,NA] 2 1 4 0 [NA,0,NA,NA] 3 1 3 1 [NA,0,NA,0] 4 1 1 0 [NA,0,1,0] 5 2 1 1 [NA,NA,NA,NA] 6 2 2 0 [1,NA,NA,NA] 7 2 3 0 [1,0,NA,NA] 8 2 4 0 [1,0,0,NA]
如果你的棋盘格子数不是固定4,只需要把.init = rep(NA_real_, 4)里的4替换为实际的格子总数即可。
内容的提问来源于stack exchange,提问作者TanZor
相关产品推荐
相关产品推荐

