You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 05:36:06