【问题标题】:Aggregating specific column grouping by columns based on condition in R根据R中的条件按列聚合特定列分组
【发布时间】:2016-10-02 22:34:44
【问题描述】:

我遇到了一个问题,如果sum $lives!=0$Access_score 如果sum $lives=0 和'Trx' 作为每个值的唯一值,我需要得到$Access_score 的加权平均值@ 987654325@

sc2=aggregate(nonsc1, by=list(nonsc1$PRSC_CID,nonsc1$IMSPayerPlanId), 
              FUN=function(x) if x$Lives=0 {colMeans(x$Breo_Access_score)} else {0} )
dt <- data.frame(IMS_ID=c(222,222,222,222,333,333,333,333),IMS_PLAN_ID=c(234,234,235,235,234,234,235,235),PLAN_ID=c(1234,678,1234,678,1234,678,1234,678),IMS_STATE=c('CA','CA','CA','CA','TX','TX','TX','TX'),PLAN_STATE=c('CA','CA','CA','CA','TX','TX','TX','TX'),ACCESS_SCORE=c(2,4,2,4,2,4,2,4),Lives=c(0,0,1000,200,0,0,1000,200),Trx=c(10,10,20,20,30,30,40,40));

我的输出应该是:

IMS_ID  IMS_PLAN_ID TRX     ACCESS_SCORE
222     234          10           3
222     235          20       2.3333
333     234          30          3
333     235          40       2.3333

【问题讨论】:

  • 请不要发布数据图像 - 从 excel 中复制和粘贴数据或使用 dput(robjectname) 获取数据的可复制和粘贴表示。

标签: r analytics aggregation


【解决方案1】:

根据您的新样本输入和预期输出,我们可以这样做:

library(data.table);
setDT(dt)[,{ s <- sum(Lives); cbind(.SD[1L,.(Trx)],ACCESS_SCORE=if (s==0) mean(ACCESS_SCORE) else sum(ACCESS_SCORE*Lives)/s); },.(IMS_ID,IMS_PLAN_ID)];
##    IMS_ID IMS_PLAN_ID Trx ACCESS_SCORE
## 1:    222         234  10     3.000000
## 2:    222         235  20     2.333333
## 3:    333         234  30     3.000000
## 4:    333         235  40     2.333333

这是使用by() 的基本 R 解决方案:

df <- as.data.frame(dt);
keys <- c('IMS_ID','IMS_PLAN_ID');
do.call(rbind,by(df,df[keys],function(g) { s <- sum(g$Lives); cbind(g[1L,c(keys,'Trx')],ACCESS_SCORE=if (s==0) mean(g$ACCESS_SCORE) else sum(g$ACCESS_SCORE*g$Lives)/s); }));
##   IMS_ID IMS_PLAN_ID Trx ACCESS_SCORE
## 1    222         234  10     3.000000
## 5    333         234  30     3.000000
## 3    222         235  20     2.333333
## 7    333         235  40     2.333333

【讨论】:

  • 应用程序我更正了我的问题其他行的其他 imsid 数据集在我想要的每个 IMS_ID 的各种 IMS_PLAN_ID 中具有不同的 IMS_ID,并且其唯一的 IMS_PLAN_ID 得分。非常感谢
  • 错误:“nonsc1[,{ s
  • 问题是资格。从LivesSum_RTLRX_TRX_CNTAccess_score 中删除nonsc1$。限定不是必需的,实际上 不能 存在,因为在 data.table 索引操作的 j 参数中,表列(或聚合的当前子集,因为我们have here) 是自动可见的,因此不需要使用包含的变量名进行限定。
  • 它的 data.frame 不是 data.table 实际上 data.table 正在抛出错误,当我删除它说“[.data.frame(nonsc1, , { : could not find function “.”) 的限定条件时
  • 您指的是哪种解决方案?如果基本 R 解决方案崩溃,我不会感到惊讶,因为 by() 效率非常低。 data.table 解决方案应该更高效。
猜你喜欢
  • 2019-05-07
  • 1970-01-01
  • 2022-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-14
  • 2014-05-29
  • 1970-01-01
相关资源
最近更新 更多