在 R 中分组,plyr/dplyr
Grouping within group in R, plyr/dplyr
我正在处理棒球数据集:
data(baseball, package="plyr")
library(dplyr)
baseball[,1:4] %>% head
id year stint team
4 ansonca01 1871 1 RC1
44 forceda01 1871 1 WS3
68 mathebo01 1871 1 FW1
99 startjo01 1871 1 NY2
102 suttoez01 1871 1 CL1
106 whitede01 1871 1 CL1
首先,我想按球队对数据集进行分组,以便找到每支球队出现的第一年,以及每支球队曾经效力过的不同球员的数量:
baseball[,1:4] %>% group_by(team) %>%
summarise("first_year"=min(year), "num_distinct_players"=n_distinct(id))
# A tibble: 132 × 3
team first_year num_distinct_players
<chr> <int> <int>
1 ALT 1884 1
2 ANA 1997 29
3 ARI 1998 43
4 ATL 1966 133
5 BAL 1954 158
现在我想添加一个列,显示任何球员 (id) 为相关球队效力的最长年限。为此,我需要以某种方式在现有组(团队)中按玩家分组,并且 select 最大行数。我该怎么做?
也许这有帮助
baseball %>%
select(1:4) %>%
group_by(id, team) %>%
dplyr::mutate(nyear = n_distinct(year)) %>%
group_by(team) %>%
dplyr::summarise(first_year = min(year),
num_distinct_players = n_distinct(id),
maxYear = max(nyear))
我试着用 base R
做这个,然后想出了这个。相当慢。
df = data.frame(t(sapply(split(baseball, baseball$team), function(x)
cbind( min(x$year),
length(unique(x$id)),
max(sapply(split(x,x$id), function(y)
nrow(y))),
names(which.max(sapply(split(x,x$id), function(y)
nrow(y)))) ))))
colnames(df) = c("Year", "Unique Players", "Longest played duration",
"Longest Playing Player")
- 首先,按团队分成不同的组
- 对于每组,取最小年份作为球队出现的第一年
- 获取唯一
id
s 的长度,即该团队中玩家的数量
- 按
id
将每个组分成子组,并获得最大行数,这将给出该团队中一名球员的最长比赛时间
- 对于每个子组,获取
id
中具有最大行数的 names
,该行给出了在该队中出场时间最长的球员的名字
我正在处理棒球数据集:
data(baseball, package="plyr")
library(dplyr)
baseball[,1:4] %>% head
id year stint team
4 ansonca01 1871 1 RC1
44 forceda01 1871 1 WS3
68 mathebo01 1871 1 FW1
99 startjo01 1871 1 NY2
102 suttoez01 1871 1 CL1
106 whitede01 1871 1 CL1
首先,我想按球队对数据集进行分组,以便找到每支球队出现的第一年,以及每支球队曾经效力过的不同球员的数量:
baseball[,1:4] %>% group_by(team) %>%
summarise("first_year"=min(year), "num_distinct_players"=n_distinct(id))
# A tibble: 132 × 3
team first_year num_distinct_players
<chr> <int> <int>
1 ALT 1884 1
2 ANA 1997 29
3 ARI 1998 43
4 ATL 1966 133
5 BAL 1954 158
现在我想添加一个列,显示任何球员 (id) 为相关球队效力的最长年限。为此,我需要以某种方式在现有组(团队)中按玩家分组,并且 select 最大行数。我该怎么做?
也许这有帮助
baseball %>%
select(1:4) %>%
group_by(id, team) %>%
dplyr::mutate(nyear = n_distinct(year)) %>%
group_by(team) %>%
dplyr::summarise(first_year = min(year),
num_distinct_players = n_distinct(id),
maxYear = max(nyear))
我试着用 base R
做这个,然后想出了这个。相当慢。
df = data.frame(t(sapply(split(baseball, baseball$team), function(x)
cbind( min(x$year),
length(unique(x$id)),
max(sapply(split(x,x$id), function(y)
nrow(y))),
names(which.max(sapply(split(x,x$id), function(y)
nrow(y)))) ))))
colnames(df) = c("Year", "Unique Players", "Longest played duration",
"Longest Playing Player")
- 首先,按团队分成不同的组
- 对于每组,取最小年份作为球队出现的第一年
- 获取唯一
id
s 的长度,即该团队中玩家的数量 - 按
id
将每个组分成子组,并获得最大行数,这将给出该团队中一名球员的最长比赛时间 - 对于每个子组,获取
id
中具有最大行数的names
,该行给出了在该队中出场时间最长的球员的名字