簡體   English   中英

使用 R summarise() 和 group_by(),同時引用其他列

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

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