我最近开始在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