首页 > 解决方案 > 分组然后根据内容改变新列

问题描述

我试图找出一种对数据进行分组的方法,然后根据分组行的内容创建一列。

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如果可能的话,我想留在里面。另外,我很想知道您是否还可以控制数据连接的顺序。例如,您能否将 DJ LeMahieu 的extra_position内容显示为:"3B/2B/1B"

标签: rdplyrtidyverse

解决方案


我们可以按“名称”分组,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="/")

推荐阅读