r-如何使用data.frame或data.table长格式方法集成多行上定义的属性



我最近开始在R中使用data.table包。我发现它非常方便地转换和聚合数据。我错过的一件事是如何转换在多行上定义的数据?我需要先将data.frame/table重新格式化为宽格式吗?

假设您有以下数据表:

dt=data.table(group=c("a","a","a","b","b","b"),
              subg=c("f1","f2","f3","f1","f2","f3"), 
              counts=c(3,4,5,8,9,10))

对于每个组,您需要计算每个子群的相对频率(c1/(c1+c2+c3))和其他属性,作为c1、c2、c3的函数(c1、c2和c3是与f1、f2和f3相关的计数)。

我可以看到如何以宽格式转换数据表,然后应用转换。有没有任何方法可以直接以长格式计算(最好使用数据表)?

一般来说,组和亚组可以用多个因素来表示。

如果我正确理解OP,你想要这样的smth:

dt[, {bigN = .N; .SD[, .N / bigN, by = subg]}, by = group]

或者(非常相似)这个:

dt[, {counts.sum = sum(counts); .SD[, counts / counts.sum, by = subg]},
     by = group]

如果您正在使用data.frame,您可以使用plyr包中的ddply(两步方法):

dt1<-ddply(dt,.(group),transform, gcount=sum(counts))# gcount=sum of count for each group
>dt1
group subg counts gcount
1     a   f1      3     12
2     a   f2      4     12
3     a   f3      5     12
4     b   f1      8     27
5     b   f2      9     27
6     b   f3     10     27
dt2<-ddply(dt1,.(group,subg),transform,rel.count=counts/gcount) #rel.count=relative frequency
>dt2
  group subg counts gcount rel.count
1     a   f1      3     12 0.2500000
2     a   f2      4     12 0.3333333
3     a   f3      5     12 0.4166667
4     b   f1      8     27 0.2962963
5     b   f2      9     27 0.3333333
6     b   f3     10     27 0.3703704

最新更新