使用ddply汇总数据帧时计数错误

时间:2014-01-03 19:45:52

标签: r plyr

在我的数据集中,我有一个连续变量mag,我从中派生出一个分类变量mag.cat,它有四个类别:1表示mag的0到1之间的值,2表示mag的值介于1和2之间,mag的值介于2和3之间的值为3 4表示mag的值大于3。数据的子集如下所示:

   location mag depth mag.cat
1     Assen 1.8   1.0       2
2 Hooghalen 2.5   1.5       3
3 Purmerend 0.7   1.2       1
4     Emmen 2.2   3.0       3
5 Geelbroek 3.6   3.0       4
6   Eleveld 2.7   3.0       3

我想将这个数据框架总结为一个新的数据框,每个位置只有一行。

我是这样做的:

df.new <- ddply(df, .(location), summarise, n.tot = as.numeric(length(location)), 
                gem.mag = round(mean(mag),1), 
                n.1 = as.numeric(length(location[mag == 1])),
                n.2 = as.numeric(length(location[mag == 2])),
                n.3 = as.numeric(length(location[mag == 3])),
                n.4 = as.numeric(length(location[mag == 4]))
                )

n.1,n.2,n.3&amp; n.4变量应包含每个位置的每个类别的计数。这些变量的总和在逻辑上应该等于n.tot,但它们不是。{0}。这可以在新数据框的头部看到:

      location  n.tot gem.mag n.1 n.2 n.3 n.4
1   Achterdiep      5     1.1   2   0   0   0
2      Alkmaar      4     3.2   0   0   1   0
3       Altena      1     1.3   0   0   0   0
4 Amelanderwad      2     1.8   0   0   0   0
5         Amen      6     1.1   0   0   0   0
6     Amerbrug      1     0.9   0   0   0   0

我期待的是:

      location  n.tot gem.mag n.1 n.2 n.3 n.4
1   Achterdiep      5     1.1   2   2   0   1
2      Alkmaar      4     3.2   0   3   1   0
3       Altena      1     1.3   0   1   0   0
4 Amelanderwad      2     1.8   0   1   1   0
5         Amen      6     1.1   3   2   0   1
6     Amerbrug      1     0.9   1   0   0   0

我做错了什么?

1 个答案:

答案 0 :(得分:3)

为什么不:

res <- xtabs( ~ location + mag.cat, data=df)
res

如果您希望将总计作为列,则cbind(tot.n= rowSums(res), res)

mag的手段:with(df, tapply(mag, location, mean))

一切:

 cbind( gem.mag= with(df, tapply(mag, location, mean)),
        tot.n= rowSums(res), 
        res)

如果没有plyr版本,我想答案是不完整的:

 require(plyr)
 df.new <- ddply(df, .(location), summarise, n.tot = as.numeric(length(location)), 
                gem.mag = round(mean(mag),1), 
                n.1 = sum(mag.cat==1),
                n.2 = sum(mag.cat==2),
                n.3 = sum(mag.cat==3),
                n.4 = sum(mag.cat==4)
                )
> df.new
   location n.tot gem.mag n.1 n.2 n.3 n.4
1     Assen     1     1.8   0   1   0   0
2   Eleveld     1     2.7   0   0   1   0
3     Emmen     1     2.2   0   0   1   0
4 Geelbroek     1     3.6   0   0   0   1
5 Hooghalen     1     2.5   0   0   1   0
6 Purmerend     1     0.7   1   0   0   0