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

我有一个包含 4 列的数据集 (data1),我一直在尝试执行各种不同的汇总函数来对数据进行分组。

列是 A(PERSON_ID),它只是一个人 ID,B(LIST_ITEMS),它是他们在列表中购买的对象 ID 的列表(例如,{{ 1}} 或 c("V5","32")) 等。我将它们保留为字符,因为无论如何它们都是 ID。列 C("45") 和 D(EXPENDITURE) 是两个变量,C 是它们总共花费了多少,当我使用 summarise 时,我只是将 C 的总和进行聚合。然而,对于 D,我想尝试一些引用 C 的东西。基本上,我想取对应于 C 分位数的 D 值。(每个人都有不同的比率,我想,假设是第 50 个百分位数)例如,到目前为止,我的代码如下所示:

RATE

现在这可以通过对 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]) (或 C 列)进行排序,然后取累积总和,然后选择与总和达到总和的 50% 时对应的值来完成,但感觉就像一种复杂的方法来做到这一点,这些是离散值。假设在 EXPENDITURE 之后,B 列的一个值的分组数据如下所示:

group_by

(我无法将它作为表格放入,因为堆栈溢出给了我一个错误,说它检测到格式不正确的代码,所以整个表格需要在它周围加上三重反引号,然后网站才会让我发布问题)>

现在,假设我想要的第 n 个百分位数是第 50 个,我基本上希望它采用 D 列的升序(因为速率从最低开始并上升),然后对C列(C列的总和为3000),所以在排序列表中,我会取累积和,然后得到D的值,当累积和达到3000的50%时,C的总和。

现在,按排序顺序,我得到 structure(list(A = c(1L,2L,3L,4L,5L,6L,7L,8L,9L),B = list(c("45","33"),c("45","33")),C = c(600L,200L,500L,300L,400L,100L),D = c(40L,20L,100L,40L,30L,80L,60L,50L,100L)),Names = c("A","B","C","D"),row.names = c(NA,class = "data.frame") 。排序列表中的下一行是 200+300+600+200=1300,累积总和为 1700,这意味着它已超过第 50 个百分位标记,因此我希望我的函数返回值 40,因为它是最接近的值在 | 8 | c("45","33")|400|50| 方向。

我将如何设计这样的功能。我给出的这个例子的示例输出是:

B C D
c(45,33) 3000 40

有没有简单的方法来执行这样的操作?

liubing065 回答:使用 R summarise() 和 group_by(),同时引用其他列

你可以求助于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
本文链接:https://www.f2er.com/26030.html

大家都在问