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
我在这个方面缺少什么,以便让我获得包含城市的所需输出?
答案 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