我有一个包含四个类似Likert的变量的数据框,只有4个可能的值,如下所示:
group var1 var2 var3 var4
1 1 4 1 3 1
2 2 1 1 1 1
3 1 1 2 1 3
4 2 1 1 2 1
5 1 2 1 4 1
6 2 4 3 4 4
7 1 1 1 1 1
8 2 4 4 3 4
9 2 2 3 3 1
10 1 4 3 2 1
11 2 2 3 1 1
12 2 1 1 1 1
13 2 3 4 4 4
14 2 4 4 4 4
15 1 1 1 1 2
16 2 3 3 2 3
17 2 4 4 2 1
18 2 2 3 4 1
19 1 1 2 1 1
20 2 3 1 3 3
21 1 1 3 1 4
22 1 4 3 4 3
23 2 1 3 3 2
24 2 1 3 1 4
25 2 2 3 2 4
26 1 1 2 3 1
27 1 3 3 1 2
28 1 4 3 3 1
29 1 2 1 3 2
30 2 4 3 3 3
现在想要获得每组和每个变量的百分比值。结果应如下所示:
group vars 1 2 3 4
1 var1 % % % %
1 var2 % % % %
1 var3 % % % %
1 var4 % % % %
2 var1 % % % %
2 var2 % % % %
2 var3 % % % %
2 var4 % % % %
百分比反映一个变量中组内值的相对量。 我想这应该是可能的,但我还没有找到可以帮助我的R功能。有没有人知道可以帮助解决这个问题的包或功能?
非常感谢提前!
答案 0 :(得分:4)
要解决此问题,您需要:
melt()
中的reshape2
执行此操作。cast()
以所需形状重新制作数据。这将为您提供包含计数的数据框。apply()
。试试这个:
library(reshape2)
mdat <- melt(dat, id.vars=c("group"), variable.name="vars")
cdat <- dcast(mdat, group + vars ~ value, length)
cdat[, 3:6] <- t(apply(cdat[, 3:6], 1, function(x)x/sum(x)))
cdat
结果:
group vars 1 2 3 4
1 1 var1 0.4615385 0.15384615 0.07692308 0.30769231
2 1 var2 0.3846154 0.23076923 0.38461538 0.00000000
3 1 var3 0.4615385 0.07692308 0.30769231 0.15384615
4 1 var4 0.5384615 0.23076923 0.15384615 0.07692308
5 2 var1 0.2941176 0.23529412 0.17647059 0.29411765
6 2 var2 0.2352941 0.00000000 0.52941176 0.23529412
7 2 var3 0.2352941 0.23529412 0.29411765 0.23529412
8 2 var4 0.4117647 0.05882353 0.17647059 0.35294118