在R中计算值的数量

5

我有以下数据集:

    ClaimType ClaimDay ClaimCost   dates    month      day
1         1        1     10811 1970-01-01     1 1970-01-01
2         1        1     18078 1970-01-01     1 1970-01-01
3         1        2     44579 1970-01-01     1 1970-01-02
4         1        3     23710 1970-01-01     1 1970-01-03
5         1        4     29580 1970-01-01     1 1970-01-04
6         1        4     36208 1970-01-01     1 1970-01-04

我想创建一个包含“索赔日”和“日期”列的新数据集。每个值应该计算索赔日。例如,由于我们有两个1、一个2、一个3和两个4,因此我希望新数据集如下所示:

ClaimDay   day
2         1970-01-01
1         1970-01-02
1         1970-01-03
2         1970-01-04

正如您所看到的,Claimday和day是相关的。

我已经尝试过

mydata <- aggregate(ClaimDay~Day,FUN=sum,data=mydata)$ClaimDay

但问题在于,当进行聚合计算时,它会同时计算摘要。 有人能帮我解决这个问题吗?

1
你可以直接使用“table”。 - David Arenburg
2个回答

10
你可以尝试以下任一方法:

使用 base R

aggregate(ClaimDay~day,FUN=length,data=mydata)

使用tapply函数

as.data.frame(tapply(mydata$ClaimDay, mydata$day, length), responseName='ClaimDay')

通过 by

by(mydata$ClaimDay, mydata$day, length, simplify = TRUE)

使用 dplyr

library(dplyr)
mydata %>% count(day)

使用 data.table

library(data.table)
data.table(mydata)[,(ClaimDay=length(ClaimDay)),by=day]
使用 plyr
library(plyr)
ddply(mydata,~day,summarise,ClaimDay=length(day))
使用 sqldf 进行操作。
library(sqldf)
sqldf('select count(ClaimDay) as ClaimDay, day from mydata group by day')

#  ClaimDay        day
#1        2 1970-01-01
#2        1 1970-01-02
#3        1 1970-01-03
#4        2 1970-01-04

并且基准测试结果:

library('microbenchmark')
microbenchmark(agg=aggregate(ClaimDay~day,FUN=length,data=mydata), 
               dplyr=mydata %>% dplyr:::count(day), 
               data.table=data.table(mydata)[,(ClaimDay=length(ClaimDay)),by=day], 
               plyr=ddply(mydata,~day,summarise,ClaimDay=length(day)),
               tapply=as.data.frame(tapply(mydata$ClaimDay, mydata$day, length), responseName='ClaimDay'),
               sqldf=sqldf('select count(ClaimDay) as ClaimDay, day from mydata group by day'),
               by=by(mydata$ClaimDay, mydata$day, length, simplify = TRUE),
               times=500)

Unit: microseconds
       expr      min        lq       mean    median        uq       max neval    cld
        agg 1280.399 1408.2675  1655.8207 1458.9445  1845.331  7732.426   500   c   
      dplyr 1019.102 1177.3345  1350.3923 1220.0995  1356.736  3835.208   500  b    
 data.table 1690.092 1883.8190  2208.6055 1957.1630  2234.283  5493.653   500    d  
       plyr 2334.995 2482.7495  2847.0871 2554.5960  2944.404  6620.096   500     e 
     tapply  226.658  273.0580   342.0902  304.0635   353.244  2748.965   500 a     
      sqldf 8395.718 9057.0870 10458.0976 9440.2650 11389.515 61480.071   500      f
         by  353.243  415.0395   492.2115  449.2520   509.765  4331.287   500 a  

当基准单位为微秒时,这意味着数据太小了。 - David Arenburg
是的,数据很小。 - Sandipan Dey

3

如果您不介意使用 dplyr 解决方案,该解决方案可在您提供的示例数据上运行。

library(dplyr)
df %>% select(ClaimDay, day) %>% 
     group_by(day) %>% 
     mutate(ClaimDay.count = n()) %>% 
     slice(1)

2
一个 dplyr 的解决方案可能就是使用专门的 count 函数。 - David Arenburg
@David Arenburg,是的,我添加了一个解决方案。 - Sandipan Dey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接