簡體   English   中英

在聚合函數中顯示多個列,包括R中的字符串/字符

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM