我有一个包含 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 |
有没有简单的方法来执行这样的操作?