[英]Using R summarise() with group_by(), while referencing other columns
我有一個包含 4 列的數據集 (data1),我一直在嘗試執行各種不同的匯總函數來對數據進行分組。
列是 A( PERSON_ID
),它只是一個人 ID,B( LIST_ITEMS
),它是他們在列表中購買的對象 ID 的列表(例如, c("V5","32")
或"45"
) 等。 我將它們保留為字符,因為無論如何它們都是 ID。 列 C( EXPENDITURE
) 和 D( RATE
) 是兩個變量,C 是它們總共花費了多少,當我使用 summarise 時,我只是將 C 的總和進行聚合。 然而,對於 D,我想嘗試一些引用 C 的東西。基本上,我想取對應於 C 分位數的 D 值。(每個人都有不同的比率,我想,假設是第 50 個百分位數)例如,到目前為止,我的代碼如下所示:
data2<-data1 %>%
unnest(LIST_ITEMS) %>%
group_by(PERSON_ID, EXPENDITURE, RATE) %>%
summarise(LIST_ITEMS= list(sort(LIST_ITEMS)), .groups = 'drop') %>%
group_by(LIST_ITEMS) %>%
summarise(EXPENDITURE=sum(EXPENDITURE), RATE=RATE[Nth percentile of EXPENDITURE])
現在這可以通過對EXPENDITURE
(或為方便EXPENDITURE
C 列)進行排序,然后取累積總和,然后選擇與總和達到總和的 50% 時對應的值來完成,但這感覺像是一種復雜的方法,這些是離散值。 假設在group_by
之后,B 列的一個值的分組數據如下所示:
structure(list(A = c(1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L),
B = list(c("45","33"), c("45","33"), c("45","33"), c("45","33"), c("45","33"), c("45","33"), c("45","33"), c("45","33"), c("45","33")),
C = c(600L, 200L, 500L, 200L, 300L, 400L, 300L, 400L, 100L),
D = c(40L, 20L, 100L, 40L, 30L, 80L, 60L, 50L, 100L)),
Names = c("A", "B", "C", "D"),
row.names = c(NA, 9L), class = "data.frame")
(我無法將它作為表格放入,因為堆棧溢出給了我一個錯誤,說它檢測到格式不正確的代碼,所以在網站讓我發布問題之前,整個表格需要圍繞它的三重反引號)
現在,假設我想要的第 n 個百分位數是第 50 個,我基本上希望它采用 D 列升序(因為速率從最低開始並上升),然后對 C 列進行累計總和( C 列的總和是 3000),所以在排序列表中,我會取累積總和,然后得到 D 的值,當累積總和達到 3000 的 50% 時,C 的總和。
現在,按排序順序,我得到200+300+600+200=1300
。 排序列表中的下一行是| 8 | c("45","33")|400|50|
| 8 | c("45","33")|400|50|
,使累積總和達到 1700,這意味着它已經超過了第 50 個百分位標記,所以我希望我的函數返回值 40,因為它是floor
方向上最接近的值。
我將如何設計這樣的功能。 我給出的這個例子的示例輸出是:
乙 | C | D |
---|---|---|
c(45,33) | 3000 | 40 |
有沒有一種簡單的方法來執行這樣的操作?
您可以借助findInterval
-
library(dplyr)
perc <- 0.5
df %>%
arrange(B, D) %>%
group_by(B) %>%
summarise(val = findInterval(sum(C) * perc, cumsum(C)),
C = sum(C),
D = D[val]) %>%
select(-val)
# B C D
# <list> <int> <int>
#1 <chr [2]> 3000 40
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.