我的数据如下:
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
我希望将其转换为2D矩阵,然后可以将其用于卡方检验。所以,我的输入需要看起来像:
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中的技能在某种程度上是缺乏的。
感谢。
答案 0 :(得分:4)
这是一个基本的reshape
问题(有关详细信息,请参阅?reshape
)。
使用基数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
答案 1 :(得分:3)
这是制作矩阵的另一种方法:
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