在我的数据集中,我有一个连续变量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
我做错了什么?
答案 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