Создать столбец с dplyr на основе значения, а также частоты другого столбца, в R - PullRequest
0 голосов
/ 08 декабря 2018

Я отредактирую название поста в ближайшее время, когда придумал лучший заголовок, но на данный момент ниже приведен короткий пример, с которым я борюсь:

dput(mydf)
structure(list(gameID = c("34", "34", "34", "34", "34", "25", 
"25", "25")), class = "data.frame", row.names = c(NA, -8L))

mydf
    gameID
1     34
2     34
3     34
4     34
5     34
6     25
7     25
8     25

(garbocCol включен только такчто в кадре данных> 1 столбец - в противном случае, пожалуйста, не обращайте внимания.Я хотел бы создать новый столбец, который будет просто столбцом gameID, вставленным со счетчиком этого gameID.Таким образом, я ищу следующий вывод:

mydf
  gameID    newCol
1     34     34-1
2     34     34-2
3     34     34-3
4     34     34-4
5     34     34-5
6     25     25-1
7     25     25-2
8     25     25-3

Столбец gameID уже является символом, и newCol предпочтительно также будет символом типа.Я работаю в длинной цепочке dplyr и пытаюсь заставить работать следующее:

mydf <- mydf %>% 
  dplyr::mutate(newCol = paste0(gameID, '-', {what goes here}))

Я довольно легко могу сделать это с помощью цикла for, однако решение dplyr будетнамного лучше.

Ответы [ 2 ]

0 голосов
/ 08 декабря 2018

Это может быть то, что вы имели в виду.

mydf %>% 
 group_by(gameID) %>% 
 dplyr::mutate(newCol = paste0(gameID, '-', seq_along(gameID)))
# A tibble: 8 x 3
# Groups:   gameID [2]
#  gameID garboCol newCol
#  <fct>     <dbl> <chr> 
#1 34            1 34-1  
#2 34            2 34-2  
#3 34            3 34-3  
#4 34            4 34-4  
#5 34            5 34-5  
#6 25            6 25-1  
#7 25            7 25-2  
#8 25            8 25-3 
0 голосов
/ 08 декабря 2018

Если нам нужно paste с последовательностью, получите последовательность с row_number(), сгруппированную по 'gameID' и paste, чтобы создать 'newCol'

mydf %>%
    group_by(gameID) %>%
    mutate(newCol = paste(gameID, row_number(), sep = '-'))
# A tibble: 8 x 3
# Groups:   gameID [2]
#  gameID garboCol newCol
#  <fct>     <dbl> <chr> 
#1 34            1 34-1  
#2 34            2 34-2  
#3 34            3 34-3  
#4 34            4 34-4  
#5 34            5 34-5  
#6 25            6 25-1  
#7 25            7 25-2  
#8 25            8 25-3  

Если мы хотимчтобы сделать это короче, опция rowid из data.table.Преимущество состоит в том, что он не будет создавать атрибуты группы в выводе

library(data.table)
mydf %>% 
  mutate(newCol = paste(gameID, rowid(gameID), sep='-'))
#   gameID garboCol newCol
#1     34        1   34-1
#2     34        2   34-2
#3     34        3   34-3
#4     34        4   34-4
#5     34        5   34-5
#6     25        6   25-1
#7     25        7   25-2
#8     25        8   25-3

или использовать его с glue (из glue)

library(glue)
mydf %>%
     mutate(newCol = glue("{gameID}-{rowid(gameID)}"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...