Вставьте пустую ячейку в каждую «X» строку в той же колонке - PullRequest
0 голосов
/ 20 марта 2020

В файле Excel у меня есть следующая таблица с заголовками как таковые:

**Date** **Session** **Player** **Pre** **Post** **Distance(m)**
Jan 1         1        Player 1    3        6          1000
Jan 1         1        Player 2    3        7          1500
Jan 1         1        Player 3    4        10         4000
Jan 1         1        Player 4    1        3          600
Jan 2         2        Player 1    2        5          1000
Jan 2         2        Player 2    -        -          1750
Jan 2         2        Player 3    5        5          3000
Jan 2         2        Player 4    3        6          1000
Jan 3         3        Player 1    3        5          2500   
Jan 3         3        Player 2    3        8          1500
Jan 3         3        Player 3    7        7          2500
Jan 3         3        Player 4    -        -            -

Что я пытаюсь сделать sh - посмотреть на числа расстояний и сравнить их с числами Pre для следующей сессии. Таким образом, на Сессии 1 для Игрока 1 их расстояние (1000) и их Pre # от 2 января (2) должны быть в одном ряду.

Чтобы сделать это, после сортировки игроков по номеру сессии, я пытаюсь найти способ вставить пустую ячейку - в столбец расстояния для каждого игрока, который выступает в качестве заполнителя для того, что будет сессия 0. Это существенно сокращает расстояния, чтобы соответствовать Pre # на следующий день.

Так что после выполнения этого для этого набора данных результат будет выглядеть следующим образом:

**Player**  **Pre for the following Day**             **Distance**
Player 1      3 (S1)                                    -  (Session 0 - Does Not Exist) (This value is inserted)               
Player 1      2 (S2)                                   1000(Session 1)                              
Player 1      3 (S3)                                   1000(Session 2)                                
Player 1      - (S4 - Not included in this example)    2500(Session 3)                       
Player 2      3 (S1)                                   -   (S0)                                      
Player 2      - (S2)                                   1500(S1)                                      
Player 2      3 (S3)                                   1750(S2)                                       
Player 2      - (S4)                                   1500(S3)                                       
Player 3      4 (S1)                                   -   (S0)                                       
Player 3      5 (S2)                                   4000(S1)                                       
Player 3      7 (S3)                                   3000(S2)                                       
Player 3      - (S4)                                   2500(S3)                                       

Игрок 4 пропустил ради времени / избыточности

В этом примере сеанс 3 является последним сеансом, поэтому Pre для S4 для всех игроков будет просто вставлен как - по умолчанию.

Таким образом, - необходимо вставлять каждые 4 строки, чтобы соответствовать каждому расстоянию и правильному игроку, и после последней сессии создайте новую строку для каждого игрока, давая - для Pre и Post, и правильное расстояние.

В моей попытке сделать это у меня есть следующий код и набор данных: из dput ()

structure(list(Date = structure(c(1577836800, 1577836800, 1577836800, 
1577836800, 1577923200, 1577923200, 1577923200, 1577923200, 1578009600, 
1578009600, 1578009600, 1578009600), class = c("POSIXct", "POSIXt"
), tzone = "UTC"), Session = c(1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 
3, 3), Player = c("Player 1", "Player 2", "Player 3", "Player 4", 
"Player 1", "Player 2", "Player 3", "Player 4", "Player 1", "Player 2", 
"Player 3", "Player 4"), Pre = c("3", "3", "4", "1", "2", "-", 
"5", "3", "3", "3", "7", "-"), Post = c("6", "7", "10", "3", 
"5", "-", "5", "6", "5", "8", "7", "-"), Distance = c("1000", 
"1500", "4000", "600", "1000", "1750", "3000", "1000", "-", "1500", 
"2500", "-")), row.names = c(NA, 12L), class = "data.frame")

и мой код:

test1 <- data.frame("2020-01-01",1,"Player 1",3,6, "-")
test2 <- data.frame("2020-01-01",4,"Player 1","-","-","2500")
names(test1) <- c("Date", "Session", "Player", "Pre", "Post", "Distance")
names(test2) <- c("Date", "Session", "Player", "Pre", "Post", "Distance")
new <- rbind(test1, stackEX) #This puts the new row at the top where I want it
                             #Not sure why this removes dates for other rows though
new <- rbind(new, test2)#This is for Session 4 which does not exist in this example

Но использование этого способа не добавляет ячейку - в столбец расстояния для уменьшения значений, и вместо этого я знаю только о том, как добавить всю новую строку вместо одной ячейки .

1 Ответ

1 голос
/ 20 марта 2020

Эту проблему можно решить путем объединения с полным набором комбинаций Player / Session и смещения Distance:

library(data.table)
setDT(DF)[CJ(Player, Session = 1:4, unique = TRUE), on = .(Player, Session)][
  , Distance := shift(Distance)][]

          Date Session   Player  Pre Post Distance
 1: 2020-01-01       1 Player 1    3    6     <NA>
 2: 2020-01-02       2 Player 1    2    5     1000
 3: 2020-01-03       3 Player 1    3    5     1000
 4:       <NA>       4 Player 1 <NA> <NA>     2500
 5: 2020-01-01       1 Player 2    3    7     <NA>
 6: 2020-01-02       2 Player 2    -    -     1500
 7: 2020-01-03       3 Player 2    3    8     1750
 8:       <NA>       4 Player 2 <NA> <NA>     1500
 9: 2020-01-01       1 Player 3    4   10     <NA>
10: 2020-01-02       2 Player 3    5    5     4000
11: 2020-01-03       3 Player 3    7    7     3000
12:       <NA>       4 Player 3 <NA> <NA>     2500
13: 2020-01-01       1 Player 4    1    3     <NA>
14: 2020-01-02       2 Player 4    3    6      600
15: 2020-01-03       3 Player 4    -    -     1000
16:       <NA>       4 Player 4 <NA> <NA>        -

Перекрестное соединение выражение

CJ(Player, Session = 1:4, unique = TRUE)

возвращает все комбинации Player / Session:

      Player Session
 1: Player 1       1
 2: Player 1       2
 3: Player 1       3
 4: Player 1       4
 5: Player 2       1
 6: Player 2       2
 7: Player 2       3
 8: Player 2       4
 9: Player 3       1
10: Player 3       2
11: Player 3       3
12: Player 3       4
13: Player 4       1
14: Player 4       2
15: Player 4       3
16: Player 4       4

Здесь достаточно аргументов по умолчанию shift(): shift(Distance) лаг Distance на один и NA используется для заполнения , т. е. значения в столбце Distance перемещаются вниз на следующую строку. Таким образом, строка 4 (сеанс 4) для Player 1 получает значение Distance предыдущего ряда (сеанс 3) в соответствии с запросом. Пустая строка вверху становится NA. Смотрите также help("shift", "data.table").

Обратите внимание, что нам не нужно группировать здесь, потому что весь столбец отстает.

Данные

DF <- structure(list(Date = structure(c(1577836800, 1577836800, 1577836800, 
1577836800, 1577923200, 1577923200, 1577923200, 1577923200, 1578009600, 
1578009600, 1578009600, 1578009600), class = c("POSIXct", "POSIXt"
), tzone = "UTC"), Session = c(1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 
3, 3), Player = c("Player 1", "Player 2", "Player 3", "Player 4", 
"Player 1", "Player 2", "Player 3", "Player 4", "Player 1", "Player 2", 
"Player 3", "Player 4"), Pre = c("3", "3", "4", "1", "2", "-", 
"5", "3", "3", "3", "7", "-"), Post = c("6", "7", "10", "3", 
"5", "-", "5", "6", "5", "8", "7", "-"), Distance = c("1000", 
"1500", "4000", "600", "1000", "1750", "3000", "1000", "2500", 
"1500", "2500", "-")), row.names = c(NA, 12L), class = "data.frame")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...