Группировка и затем Mutating новый столбец на основе содержимого - PullRequest
1 голос
/ 03 марта 2020

Я пытаюсь найти способ группировки данных, а затем создать столбец на основе содержимого сгруппированных строк.

Образец df для манипулирования

df <- tibble::tribble(
              ~name, ~position, ~G,
      "DJ LeMahieu",      "1B", 40,
      "DJ LeMahieu",      "2B", 75,
      "DJ LeMahieu",      "3B", 52,
        "Max Muncy",      "1B", 65,
        "Max Muncy",      "2B", 70,
        "Max Muncy",      "3B", 35,
  "Whit Merrifield",      "2B", 82,
  "Whit Merrifield",      "OF", 61
  )

Затем я хочу, чтобы этот контент был сгруппирован на уровне имени. Я хочу создать новый столбец с именем extra_position. Этот столбец будет объединением содержимого столбца позиции, разделенного символом «/». Пример вывода ниже:

output_df <- tibble::tribble(
              ~name,  ~extra_position,
      "DJ LeMahieu", "1B/2B/3B",
        "Max Muncy", "1B/2B/3B",
  "Whit Merrifield",    "2B/OF"
  )

Я бы хотел остаться в пределах tidyverse, если это возможно. Кроме того, мне любопытно узнать, можете ли вы также контролировать порядок объединения данных. Например, вы можете сделать так, чтобы контент extra_position DJ LeMahieu показывался как: "3B/2B/1B"?

1 Ответ

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

Мы можем сгруппировать по «имени», paste или (str_c) столбец «по позиции», collapse поместив элементы в одну строку

library(dplyr)
library(stringr)
df %>%
    group_by(name) %>% 
    summarise(extra_position = str_c(position, collapse="/"))

Если нам нужно rev иначе порядок

df %>% 
    group_by(name) %>% 
    summarise(position = str_c(rev(position), collapse="/"))

или если он основан на значениях

df %>% 
    group_by(name) %>%
    summarise(position = str_c(gtools::mixedsort(position,
            decreasing = TRUE), collapse="/"))

или с data.table

library(data.table)
setDT(df)[, .(extra_position = paste(position, collapse="/")), .(name)]

В base R используйте aggregate

aggregate(position ~ name, df, paste, collapse="/")
...