R Вмъкване на стойност в Dataframe

Имам много сложен проблем, надявам се някой да ми помогне -› искам да копирам стойност на ред (т.е. Играч 1 или Играч 2) в два други реда (за Играч 3 и 4), ако и само ако тези играчи са в същото Лечение, група и период И този играч наистина е избран (вижте колоната Player.Picked)

Знам, че с tidyverse мога да групирам_по колоните, които ме интересуват: Лечение, Група и Период. Не съм сигурен обаче как да процедирам с условието, че е изпълнено избрания играч и след това как да извлека тази стойност по подходящ начин за играчи 3 и 4 в едно и също третиране, група, период.

Колоната е извлечена. Стойността на играч 1/2 трябва да бъде резултатът. (Ръчно предоставих първите четири правилни решения).

Някакви идеи? Помощта ще бъде много ценена. Благодаря много предварително!

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
 

person Matthias Van Herrmann    schedule 30.06.2020    source източник
comment
Можете ли да добавите информация какво имате предвид под избран играч? т.е. играч е избран, когато има стойност на Player.Picked 1 или 2, но не и 0? В допълнение, какви точно стойности на играчите искате да замените кои NA?   -  person Javier    schedule 30.06.2020
comment
i want to copy a row value (i.e. Player 1 or Player 2) into two other rows - как решавате дали да копирате стойността от играч 1 или играч 2?   -  person ismirsehregal    schedule 30.06.2020
comment
Здравейте! Ще се опитам да дам пример. В първия ред играч 1 е в група 6. За всички играчи 3,4 в група 6 ще бъде избран играч 1. Само един играч (измежду двама играчи (1,2) може да бъде избран). Ако player.picked е равно на 0, нито играч 1, нито играч 2 са избрани.   -  person Matthias Van Herrmann    schedule 30.06.2020
comment
Можете да си представите, че играч 1 и 2 се състезават помежду си. Играч 5 избира едно от двете или нито едно. Тогава играчи 3 и 4 имат достъп до информацията на избрания играч (1 или 2) или до никаква. Ако играч 5 избере играч 1, тогава Player.Picked = 1. Ако играч 5 избере играч 2, тогава Player.Picked = 2. Ако не избере нито един, тогава Player.Picked = 0.   -  person Matthias Van Herrmann    schedule 30.06.2020
comment
За всеки Treatment, Group и Period ще бъде избран само един играч, нали? Така че в крайна сметка искате само един ред за тези комбинации (summarise) или няколко реда?   -  person Ronak Shah    schedule 01.07.2020
comment
Помислете за Група 5 / Играч 5, Играч 1 беше избран. Стойността на Player1/2 за играч 1 е 8, но е извлечена. Стойността на Player1/2 е 4?   -  person ismirsehregal    schedule 01.07.2020
comment
@Ronak Skah точно, за всяко лечение, група и период ще бъде избран само един играч (или нито един) -› искам избраният играч да се появи в реда на играчи 3 и 4 в същото лечение, група и период   -  person Matthias Van Herrmann    schedule 01.07.2020
comment
@ ismirsehregal -› извлечено. Стойността на Player1/2 ще бъде 8 (не искам да разделям стойността на 2, написах Player1/2, защото може да бъде стойността от играч 1 или 2)   -  person Matthias Van Herrmann    schedule 01.07.2020
comment
extracted.Player1/2Value would be 8 точно, но е 4 във вашия набор от данни.   -  person ismirsehregal    schedule 01.07.2020
comment
Да, защото избраният играч беше играч 2. (с други думи играч 2 е избраният играч в група 5) -› играч 3 и играч 4 вижте стойността на играч 2   -  person Matthias Van Herrmann    schedule 01.07.2020
comment
Мислех си, че има предвид това какво би било, ако   -  person Matthias Van Herrmann    schedule 01.07.2020
comment
в Group5 Player5 избра Player1, а не Player2 (вижте последния ред).   -  person ismirsehregal    schedule 01.07.2020
comment
много съжалявам, че това беше печатна грешка.   -  person Matthias Van Herrmann    schedule 01.07.2020
comment
Значи извлечено. Стойността на Player1/2 трябва да бъде 8, а не 4 (за група 5), нали?   -  person ismirsehregal    schedule 01.07.2020
comment
сега коригирах правописната грешка, играч 5 избра играч 2 -› така че извлечената стойност трябва да бъде 4. съжалявам за неудобството   -  person Matthias Van Herrmann    schedule 01.07.2020
comment
Току-що актуализирах отговора си с последния ви набор от данни.   -  person ismirsehregal    schedule 01.07.2020
comment
Благодаря ви отново, наистина оценявам вашата помощ!   -  person Matthias Van Herrmann    schedule 01.07.2020


Отговори (1)


Не съм сигурен дали разбрах необходимата логика; тук предполагам, че играч 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

Получената таблица се различава от вашия очакван резултат (extracted.Player1/2Value срещу extractedValue, но в моите очи тя следва обяснената логика):

    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
person ismirsehregal    schedule 01.07.2020
comment
Много ви благодаря! Това е точно това, което търсих. Съжалявам, че се затрудних да обясня логиката! Но решението е правилно! - person Matthias Van Herrmann; 01.07.2020