-2

我最近开始使用 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)。

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

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

4

2 回答 2

1

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

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

或者也许(并且非常相似)这个:

dt[, {counts.sum = sum(counts); .SD[, counts / counts.sum, by = subg]},
     by = group]
于 2013-08-07T18:39:55.933 回答
0

如果您使用的是 data.frame,则可以使用ddplyplyr 包(两步法):

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
于 2013-08-07T18:51:35.733 回答