R 在数据框中插入值

R Insert Value within Dataframe

我有一个非常复杂的问题,我希望有人能提供帮助 -> 我想将一行值(即玩家 1 或玩家 2)复制到另外两行(对于玩家 3 和 4)当且仅当这些球员处于相同的待遇、组和时期,并且该球员确实被选中(参见列 Player.Picked)

我知道使用 tidyverse 我可以 group_by 我感兴趣的专栏:治疗、组和时期。 但是,我不确定如何继续满足 Player Picked 的条件,然后如何在相同的治疗、组、周期中为玩家 3 和 4 适当地提取这个值。

列“extracted.Player 1/2 Value”应该是输出。 (我已经手动提供了前四个正确的解决方案)。

有什么想法吗?帮助将不胜感激。非常感谢!

df
T   Player    Group      Player.Picked   Period     Player1/2Value         extracted.Player1/2Value
1     1         6              1         1          10
1     2         6              1         1          9 
1     3         5              2         1          NA                          -> 4
1     4         6              1         1          NA                          -> 10
1     5         3              1         1          NA                      
1     1         5              2         1          8                           
1     2         1              0         1          7
1     3         6              1         1          NA                          -> 10
1     4         2              2         1          NA
1     5         2              2         1          NA
1     1         1              0         1          7
1     2         2              2         1          11
1     3         3              1         1          NA
1     4         4              1         1          NA   
1     5         4              1         1          NA
1     1         2              2         1          21
1     2         4              1         1          17
1     3         1              0         1          NA
1     4         5              2         1          NA                           -> 4
1     5         6              1         1          NA  
1     1         3              1         1          12
1     2         3              1         1          15
1     3         4              1         1          NA
1     4         1              0         1          NA
1     5         1              0         1          NA
1     1         4              1         1          11 
1     2         5              2         1          4
1     3         2              2         1          NA
1     4         3              1         1          NA
1     5         5              2         1          NA
 

我不确定我是否理解了所需的逻辑;在这里,我假设玩家 5 总是在每组中选择玩家 1 或 2。

所以,这是我使用 library(data.table):

的方法
library(data.table)

DT <- data.table::data.table(
                 check.names = FALSE,
                           T = c(1L,1L,1L,
                                 1L,1L,1L,1L,1L,1L,1L,1L,1L,1L,1L,1L,
                                 1L,1L,1L,1L,1L,1L,1L,1L,1L,1L,1L,
                                 1L,1L,1L,1L),
                      Player = c(1L,2L,3L,
                                 4L,5L,1L,2L,3L,4L,5L,1L,2L,3L,4L,5L,
                                 1L,2L,3L,4L,5L,1L,2L,3L,4L,5L,1L,
                                 2L,3L,4L,5L),
                       Group = c(6L,6L,5L,
                                 6L,3L,5L,1L,6L,2L,2L,1L,2L,3L,4L,4L,
                                 2L,4L,1L,5L,6L,3L,3L,4L,1L,1L,4L,
                                 5L,2L,3L,5L),
               Player.Picked = c(1L,1L,2L,
                                 1L,1L,2L,0L,1L,2L,2L,0L,2L,1L,1L,1L,
                                 2L,1L,0L,2L,1L,1L,1L,1L,1L,0L,0L,
                                 1L,2L,2L,2L),
                      Period = c(1L,1L,1L,
                                 1L,1L,1L,1L,1L,1L,1L,1L,1L,1L,1L,1L,
                                 1L,1L,1L,1L,1L,1L,1L,1L,1L,1L,1L,
                                 1L,1L,1L,1L),
            `Player1/2Value` = c(10L,9L,NA,
                                 NA,NA,8L,7L,NA,NA,NA,7L,11L,NA,NA,
                                 NA,21L,17L,NA,NA,NA,12L,15L,NA,NA,NA,
                                 11L,4L,NA,NA,NA),
  `extracted.Player1/2Value` = c(NA,NA,4L,
                                 10L,NA,NA,NA,10L,NA,NA,NA,NA,NA,NA,
                                 NA,NA,NA,NA,4L,NA,NA,NA,NA,NA,NA,NA,
                                 NA,NA,NA,NA)
)

setorderv(DT, cols = c("T", "Group", "Period", "Player"))

Player5PickedDT <- DT[Player == 5, Player.Picked, by = c("T", "Group", "Period")]
setnames(Player5PickedDT, old = "Player.Picked", new = "Player5Picked")
DT <- DT[Player5PickedDT, on = c("T", "Group", "Period")]

extractedDT <- DT[Player == Player5Picked & Player5Picked > 0, `Player1/2Value`, by = c("T", "Group", "Period")]
setnames(extractedDT, old = "Player1/2Value", new = "extractedValue")
DT[, "Player5Picked" := NULL]

DT <- extractedDT[DT, on = c("T", "Group", "Period")]
DT[, extractedValue := fifelse(Player %in% c(3, 4), yes = extractedValue, no = NA_real_)]

setcolorder(DT, c("T", "Group", "Period", "Player", "Player.Picked", "Player1/2Value", "extracted.Player1/2Value", "extractedValue"))

DT

结果 table 与您的预期结果不同(extracted.Player1/2ValueextractedValue,但在我看来它遵循解释的逻辑):

    T Group Period Player Player.Picked Player1/2Value extracted.Player1/2Value extractedValue
 1: 1     1      1      1             0              7                       NA             NA
 2: 1     1      1      2             0              7                       NA             NA
 3: 1     1      1      3             0             NA                       NA             NA
 4: 1     1      1      4             1             NA                       NA             NA
 5: 1     1      1      5             0             NA                       NA             NA
 6: 1     2      1      1             2             21                       NA             NA
 7: 1     2      1      2             2             11                       NA             NA
 8: 1     2      1      3             2             NA                       NA             11
 9: 1     2      1      4             2             NA                       NA             11
10: 1     2      1      5             2             NA                       NA             NA
11: 1     3      1      1             1             12                       NA             NA
12: 1     3      1      2             1             15                       NA             NA
13: 1     3      1      3             1             NA                       NA             12
14: 1     3      1      4             2             NA                       NA             12
15: 1     3      1      5             1             NA                       NA             NA
16: 1     4      1      1             0             11                       NA             NA
17: 1     4      1      2             1             17                       NA             NA
18: 1     4      1      3             1             NA                       NA             11
19: 1     4      1      4             1             NA                       NA             11
20: 1     4      1      5             1             NA                       NA             NA
21: 1     5      1      1             2              8                       NA             NA
22: 1     5      1      2             1              4                       NA             NA
23: 1     5      1      3             2             NA                        4              4
24: 1     5      1      4             2             NA                        4              4
25: 1     5      1      5             2             NA                       NA             NA
26: 1     6      1      1             1             10                       NA             NA
27: 1     6      1      2             1              9                       NA             NA
28: 1     6      1      3             1             NA                       10             10
29: 1     6      1      4             1             NA                       10             10
30: 1     6      1      5             1             NA                       NA             NA
    T Group Period Player Player.Picked Player1/2Value extracted.Player1/2Value extractedValue