我有这样的数据:
total position division
34 C ATL
34 C CEN
47 C NE
46 C NW
44 C PAC
42 C SE
57 D ATL
50 D CEN
44 D NE
52 D NW
42 D PAC
52 D SE
29 L ATL
34 L CEN
28 L NE
34 L NW
29 L PAC
24 L SE
26 R ATL
33 R CEN
25 R NE
29 R NW
24 R PAC
35 R SE
我希望将其转换为二维矩阵,然后可以用于卡方检验。因此,我的输入需要看起来像:
division position
C D L R
ATL 34 57 29 26
CEN 34 50 34 33
NE 47 44 28 25
NW 46 52 34 29
PAC 44 42 29 24
SE 42 52 24 35
简而言之,我需要在一个向量列标头中生成值,并在另一个向量行标头中生成值。在生成的2D矩阵中,每行中出现的总价值应移动到行标题和列标题的交叉处(例如,NE和D为44)。
顺序并不重要,在最终的矩阵中,任何向量都可以是行或列,并且输入总是有三列:total, foo和bar。
我怎样才能做到这一点?我不愿意在R中使用一些程序化的东西,而我的R技能目前有些欠缺。
谢谢。
这是一个基本的reshape
问题(更多信息请参见?reshape
)。
使用base R,您可以执行以下操作(假设您的数据名为"mydf"):
> reshape(mydf, direction = "wide", idvar = "division", timevar = "position")
division total.C total.D total.L total.R
1 ATL 34 57 29 26
2 CEN 34 50 34 33
3 NE 47 44 28 25
4 NW 46 52 34 29
5 PAC 44 42 29 24
6 SE 42 52 24 35
也可以使用xtabs
。对给定组合的多个值求和:
> xtabs(total ~ division + position, mydf)
position
division C D L R
ATL 34 57 29 26
CEN 34 50 34 33
NE 47 44 28 25
NW 46 52 34 29
PAC 44 42 29 24
SE 42 52 24 35
另一种方法是创建一个矩阵:
matrix(df$total, ncol=4, dimnames=list(unique(df$division), unique(df$position)))
## C D L R
## ATL 34 57 29 26
## CEN 34 50 34 33
## NE 47 44 28 25
## NW 46 52 34 29
## PAC 44 42 29 24
## SE 42 52 24 35