我有來自游戲戰艦的多個游戲的資料。它看起來像這樣:
> 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))
game position hit
1 1 2 0
2 1 4 0
3 1 3 1
4 1 1 0
5 2 1 1
6 2 2 0
7 2 3 0
8 2 4 0
每一行是玩家的一次移動:位置是平方數,命中表示他們是否擊中了船。我想創建一個額外的行,在每次移動之前指示板的狀態。它應該是這樣的:
game position hit board_state
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]
因此,棋盤狀態會根據最后一步的位置和結果進行更新。
我在這里發現具有挑戰性的是,board_state第 r 行的定義取決于它在第 r-1 行的狀態,而滯后在這里沒有用,因為它在同一列中。我希望這很清楚。
關于如何實作這一點的任何想法?謝謝!!!
uj5u.com熱心網友回復:
這是一種使用dplyrand的方法tidyr。首先,我添加一列來跟蹤我們在每場比賽中開啟的回合。(這將有助于稍后我們旋轉寬度的步驟。)然后我“完成”表格,為每場比賽中的每個位置和每個轉彎都有一行。然后我們可以向下“填充”并后退一步,以便每個位置都反映其過去的歷史。最后,我們可以按游戲分組,然后生成一個“board_position”摘要,將每個位置的“命中”值連接起來。
library(dplyr); library(tidyr)
df %>%
group_by(game) %>%
mutate(turn = row_number()) %>%
complete(game, position, turn) %>%
group_by(game, position) %>%
fill(hit) %>%
mutate(hit = lag(hit)) %>%
group_by(game, turn) %>%
summarize(board_state = paste(hit, collapse = ", "), .groups = "drop")
結果
# A tibble: 8 × 3
game turn board_state
<dbl> <int> <chr>
1 1 1 NA, NA, NA, NA
2 1 2 NA, 0, NA, NA
3 1 3 NA, 0, NA, 0
4 1 4 NA, 0, 1, 0
5 2 1 NA, NA, NA, NA
6 2 2 1, NA, NA, NA
7 2 3 1, 0, NA, NA
8 2 4 1, 0, 0, NA
uj5u.com熱心網友回復:
我最終得到了以下解決方案:
create_board_states <- function(positions,hits) {
board_state = rep(NA,4)
board_states = c();
for (p in seq_along(positions)) {
board_states = c(board_states, paste(board_state,collapse=','));
board_state[positions[p]]=hits[p];
}
return(board_states)
}
df %>%
group_by(game) %>%
summarise(board_state=create_board_states(position,hit)) %>%
mutate(board_state=as.list(strsplit(board_state,',')))
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/351377.html
