0

我有一个数据框:

set.seed(1234)
mydata <- data.frame(d1=strsplit("AAABBCCCCCDD", "")[[1]],
d2=rnorm(12), d3=c("aba", "bbc", "ccb", "aba", "bbc", "ccb", "aba", "aba", "ccb", "bbc", "aba", "bbc"),
d4=c(101:103, 201:202, 301:305, 401:402))

我想要一个 d1 到 d3 的矩阵,其中包含每个 d1 中每个 d3 的总和。

我可以使用包 reshape,但问题是我使用的是 R 3.0,并且没有 reshape 版本。

有什么建议吗?干杯!

4

3 回答 3

2

首先,reshape(和 reshape2)在 R 3.0 中可以正常工作。其次,我假设您是对 d2 求和,而不是对 d3 求和。你可以用plyr这个。

require(plyr)
ddply(mydata, .(d1), summarise, d2=sum(d2))
于 2013-05-20T16:09:11.727 回答
2

对于您想要的任何变量,都可以这样做。只需将 d2 切换到 d4。

tapply(mydata$d2,mydata[,c("d1","d3")],sum)

结果是……

   d3
d1         aba        bbc         ccb
  A -1.2070657  0.2774292  1.08444118
  B -2.3456977  0.4291247          NA
  C -1.1213718 -0.8900378 -0.05839611
  D -0.4771927 -0.9983864          NA
于 2013-05-20T16:11:08.223 回答
2

正如其他人所指出的,您的问题不清楚。如果您只对sum聚合函数感兴趣,那么您可以简单地使用xtabs

> xtabs(d2 ~ d1 + d3, mydata)
   d3
d1          aba         bbc         ccb
  A -1.20706575  0.27742924  1.08444118
  B -2.34569770  0.42912469  0.00000000
  C -1.12137182 -0.89003783 -0.05839611
  D -0.47719270 -0.99838644  0.00000000

要回到 a data.frame,将整个东西包裹在as.data.frame.matrix(不仅仅是as.data.frame):

> as.data.frame.matrix(xtabs(d2 ~ d1 + d3, mydata))
         aba        bbc         ccb
A -1.2070657  0.2774292  1.08444118
B -2.3456977  0.4291247  0.00000000
C -1.1213718 -0.8900378 -0.05839611
D -0.4771927 -0.9983864  0.00000000
于 2013-05-20T16:31:36.733 回答