R - dplyr总结并保留其他列

时间:2016-08-23 03:58:15

标签: r dplyr summarize

我正在对数据进行分组,然后对其进行汇总,但也希望保留另一列。我不需要对该列的内容进行任何评估,因为它总是与group_by列相同。我可以将它添加到group_by语句中,但似乎并没有#34;正确"。我希望在State.Full.Name分组后保留State。感谢

TDAAtest <- data.frame(State=sample(state.abb,1000,replace=TRUE))
TDAAtest$State.Full.Name <- state.name[match(TDAAtest$State,state.abb)]


TDAA.states <- TDAAtest %>%
  filter(!is.na(State)) %>%
  group_by(State) %>%
  summarize(n=n()) %>%
  ungroup() %>%
  arrange(State)

2 个答案:

答案 0 :(得分:16)

也许我们需要

TDAAtest %>% 
     filter(!is.na(State)) %>%
     group_by(State) %>% 
     summarise(State.Full.Name = first(State.Full.Name), n = n())

或使用mutate创建列,然后执行distinct

TDAAtest %>% f
     filter(!is.na(State)) %>%
     group_by(State) %>% 
     mutate(n= n()) %>% 
     distinct(State, .keep_all=TRUE)

答案 1 :(得分:0)

我相信有比接受的答案更准确的答案,特别是当您没有每组中其他列的唯一数据时(例如,基于一个特定列的最大或最小或前 n 个项目 ).

尽管已接受的答案适用于这个问题,例如,您希望找到每个州人口最多的县。 (您需要有 countypopulation 列)。

我们有以下选择:

1. dplyr 版本

this link 开始,您需要三个额外的操作(mutateungroupfilter)来实现:

TDAAtest %>% 
     filter(!is.na(State)) %>%
     group_by(State) %>% 
     mutate(maxPopulation = max(Population)) %>% 
     ungroup() %>%
     filter(maxPopulation == Population)

2.功能版本

这个给你尽可能多的灵活性,你可以对每个组应用任何类型的操作:

maxFUN = function(x) {
  # order population in a descending order
  x = x[with(x, order(-Population)), ]
  x[1, ]
}

TDAAtest %>% 
     filter(!is.na(State)) %>%
     group_by(State) %>%
     do(maxFUN(.)) 

强烈建议将此用于更复杂的操作。例如,您可以通过为 topN 中返回的数据框设置 x[1:topN] 来返回每个州的前 n (maxFUN) 个县。