在聚合函数中显示多个列,包括R中的字符串/字符

时间:2015-07-29 10:24:44

标签: r dataframe subset

R noob问题。

假设我有这个数据框:

City          State Pop
Fresno          CA  494
San Franciso    CA  805
San Jose        CA  945
San Diego       CA  1307
Los Angeles     CA  3792
Reno            NV  225
Henderson       NV  257
Las Vegas       NV  583
Gresham         OR  105
Salem           OR  154
Eugene          OR  156
Portland        OR  583
Fort Worth      TX  741
Austin          TX  790
Dallas          TX  1197
San Antonio     TX  1327
Houston         TX  2100

我想让每个州的人口数量达到每个第三低,这将是:

City         State  Pop
San Jose        CA  945
Las Vegas       NV  583
Eugene          OR  156
Dallas          TX  1197

我试过这个:

ord_pop_state <- aggregate(Pop ~ State  , data = ord_pop, function(x) { x[3] } )

我得到了这个:

State  Pop
 CA  945
 NV  583
 OR  156
 TX 1197

我在这个方面缺少什么,以便让我获得包含城市的所需输出?

3 个答案:

答案 0 :(得分:3)

我建议尝试使用data.table包进行此类任务,因为语法更容易,代码更有效。我还建议添加order函数以确保数据已排序

library(data.table)
setDT(ord_pop)[order(Pop), .SD[3L], keyby = State]
#    State      City  Pop
# 1:    CA  San Jose  945
# 2:    NV Las Vegas  583
# 3:    OR    Eugene  156
# 4:    TX    Dallas 1197

基本上,首先数据按Pop排序,然后我们将.SD(数据本身的符号参数)按State

进行子集化

虽然这也很容易用基础R解决(我们假设数据在这里排序),我们可以为每个组创建一个索引然后只用该索引做一个简单的子集

ord_pop$indx <- with(ord_pop, ave(Pop, State, FUN = seq))
ord_pop[ord_pop$indx == 3L, ]
#         City State  Pop indx
# 3   San Jose    CA  945    3
# 8  Las Vegas    NV  583    3
# 11    Eugene    OR  156    3
# 15    Dallas    TX 1197    3

答案 1 :(得分:0)

这是dplyr版本:

df2 <- df %>%
    group_by(state) %>% # Group observations by state
    arrange(-pop) %>% # Within those groups, sort in descending order by pop
    slice(3) # Extract the third row in each arranged group

这是我用来测试它的玩具数据:

set.seed(1)
df <- data.frame(state = rep(LETTERS[1:3], each = 5), city = rep(letters[1:5], 3), pop = round(rnorm(15, 1000, 100), digits=0))

这是其中的输出;这是一个巧合,&#39; b&#39;在每种情况下都是第三大,而不是代码中的小故障:

> df2
Source: local data frame [3 x 3]
Groups: state

  state city  pop
1     A    b 1018
2     B    b 1049
3     C    b 1039

答案 2 :(得分:0)

在R中,使用不同的包可以实现相同的结果。包的选择是代码效率和简单性之间的权衡。

由于您来自强大的SQL背景,因此可能更容易使用:


cf push phpinfo-jbs2 -b Github -s cflinuxfs2