[英]Showing multiple columns in aggregate function including strings/characters in R
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
我在這個方面缺少什么,以便讓我獲得包含城市的所需輸出?
我建議嘗試使用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
命令的,然后我們按State
對.SD
(數據本身的符號參數)進行子集化
雖然這也很容易用基礎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
這是一個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))
這是從那里輸出的; 巧合的是'b'在每種情況下都是第三大,而不是代碼中的小故障:
> 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
在R中,使用不同的包可以實現相同的結果。包的選擇是代碼的效率和簡單性之間的權衡。
由於您來自強大的SQL背景,因此可能更容易使用:
library(sqldf)
#Example to return 3rd lowest population of a State
result <-sqldf('Select City,State,Pop from data order by Pop limit 1 offset 2;')
#Note the SQL query is a sample and needs to be modifed to get desired result.
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.