atc*_*aus 14 r dplyr summarize
我正在对数据进行分组然后对其进行总结,但是还想保留另一个列.我不需要对该列的内容进行任何评估,因为它始终与group_by列相同.我可以将它添加到group_by语句中,但这似乎并不"正确".我希望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)
Run Code Online (Sandbox Code Playgroud)
akr*_*run 20
也许我们需要
TDAAtest %>%
filter(!is.na(State)) %>%
group_by(State) %>%
summarise(State.Full.Name = first(State.Full.Name), n = n())
Run Code Online (Sandbox Code Playgroud)
或者用于mutate创建列,然后执行distinct
TDAAtest %>% f
filter(!is.na(State)) %>%
group_by(State) %>%
mutate(n= n()) %>%
distinct(State, .keep_all=TRUE)
Run Code Online (Sandbox Code Playgroud)
小智 10
要保留所有列,您可以将其across()作为summarize参数包含在内,如 的文档中所述dplyr::do()。
by_cyl <- head(mtcars) %>%
group_by(cyl)
by_cyl %>%
summarise(m_mpg = mean(mpg), across())
cyl m_mpg mpg disp hp drat wt qsec vs am gear carb
<dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 4 22.8 22.8 108 93 3.85 2.32 18.6 1 1 4 1
2 6 20.4 21 160 110 3.9 2.62 16.5 0 1 4 4
3 6 20.4 21 160 110 3.9 2.88 17.0 0 1 4 4
4 6 20.4 21.4 258 110 3.08 3.22 19.4 1 0 3 1
5 6 20.4 18.1 225 105 2.76 3.46 20.2 1 0 3 1
6 8 18.7 18.7 360 175 3.15 3.44 17.0 0 0 3 2
Run Code Online (Sandbox Code Playgroud)
要仅保留未更改列的子集,您可以在across使用tidyselect语义中选择它们。
我相信有比接受的答案更准确的答案,特别是当您没有每组中其他列的唯一数据时(例如,基于一个特定列的最大或最小或前 n 项)。
例如,虽然接受的答案适用于这个问题,但您希望找到每个州人口最多的县。(您需要有county和population列)。
我们有以下选择:
1.dplyr版本
通过此链接,您可以通过三个额外操作(mutate、ungroup和filter)来实现此目的:
TDAAtest %>%
filter(!is.na(State)) %>%
group_by(State) %>%
mutate(maxPopulation = max(Population)) %>%
ungroup() %>%
filter(maxPopulation == Population)
Run Code Online (Sandbox Code Playgroud)
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(.))
Run Code Online (Sandbox Code Playgroud)
对于更复杂的操作,强烈推荐使用此方法。例如,您可以通过将返回的数据帧包含在 中,返回topN每个州的前 n ( ) 个县。x[1:topN]maxFUN