Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用data.frame或data.table长格式方法集成在多行上定义的属性_R_Dataframe_Transform_Aggregate_Data.table - Fatal编程技术网

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

如何使用data.frame或data.table长格式方法集成在多行上定义的属性,r,dataframe,transform,aggregate,data.table,R,Dataframe,Transform,Aggregate,Data.table,我最近开始在R中使用data.table包。我发现它非常方便地转换和聚合数据。我错过的一件事是如何转换定义在多行上的数据?我是否需要首先以宽格式重塑data.frame/表 假设您有以下数据表: 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)) 对于每个组,您要计算每

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

假设您有以下数据表:

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]
或者可能(非常类似地)是这样的:


如果您使用的是data.frame,则可以使用plyr软件包中的
ddply
(两步方法):

dt1dt1
组子计数gcount
1 a f1 3 12
2 a f2 4 12
3 a f3 5 12
4 b f1 8 27
5B F29 27
6B F31027
dt2dt2
组子计数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
5B F29270.3333333
6B F310270.37037037004

目前我觉得这个问题有点模糊/宽泛。什么是c1,c2,c3?你想做什么手术?一般来说,为了提问/回答,你必须说明什么操作,并举例说明你想要的输出应该是什么(例如:对于这个相对频率)。对于这个特殊情况,我会这样做:
dt[,sc:=sum(counts),by=group][,counts:=counts/sc]
dt[, {counts.sum = sum(counts); .SD[, counts / counts.sum, by = subg]},
     by = group]
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