R:创建分组变量和频率的数据矩阵

时间:2017-12-21 11:53:10

标签: r dataframe matrix

我有一个包含三个类别的数据框:学生成绩(成绩),学生报告的1-5值,作业有多容易(水平),报告每个1-5值的学生百分比(百分比) ) 例如,

grade <- c('A','A','A','A','B','B','B','B','C+','C+','C+','C-','C-','C-','D','D','N','N')
level <- c(2,3,4,5,2,3,4,5,2,3,4,2,3,4,2,3,1,3)
percentage <- c(0.8403361,12.605042,12.605042,0.8403361,2.5210084,
                23.5294118,10.9243697, 2.5210084, 4.2016807, 11.7647059, 
                5.8823529, 0.8403361, 4.2016807, 1.6806723, 0.8403361, 
                2.5210084, 0.8403361, 0.8403361)

df <- data.frame(grade, level, percentage)

grade level percentage
A      2    0.8403361
A      3    12.605042
A      4    12.605042
A      5    0.8403361
B      2    2.5210084
B      3    23.5294118
B      4    10.9243697
B      5    2.5210084
C+     2    4.2016807
C+     3    11.7647059
C+     4    5.8823529
C-     2    0.8403361
C-     3    4.2016807
C-     4    1.6806723
D      2    0.8403361
D      3    2.5210084
N      1    0.8403361
N      3    0.8403361

请注意“容易度”&#39;除了&#34; N&#34;

之外,所有等级都缺少(等级)1

现在我需要将这些数据放入类似矩阵的方式,看起来应该是这样的,

            A           B           C+          C-          D           N
1           0           0           0           0           0   0.8403361
2   0.8403361   2.5210084   4.2016807   0.8403361   0.8403361           0
3   12.605042   23.5294118  11.7647059  4.2016807   2.5210084   0.8403361
4   12.605042   10.9243697  5.8823529   1.6806723          0            0
5   0.8403361   2.5210084           0           0          0            0

你能帮我用R代码转换数据帧吗? 在这里,我想要R代码寻找&#34; 1&#34;即使它们可能在频率表中丢失,也会保持水平。应该&#34; 1&#34;水平和0百分比预先引入表中或我可以以某种方式自动化它? (通过ifelse检查)

2 个答案:

答案 0 :(得分:0)

您可以使用dcast包中的reshape2

library(reshape2)
dcast(df, formula="level~grade", fill=0, value.var="percentage")

答案 1 :(得分:0)

使用tidyr,您可以使用spread解决此问题:

library(tidyr)
spread(data = df, key = grade, value = percentage, fill = 0)

#   level          A         B        C-        C+         D         N
# 1     1  0.0000000  0.000000 0.0000000  0.000000 0.0000000 0.8403361
# 2     2  0.8403361  2.521008 0.8403361  4.201681 0.8403361 0.0000000
# 3     3 12.6050420 23.529412 4.2016807 11.764706 2.5210084 0.8403361
# 4     4 12.6050420 10.924370 1.6806723  5.882353 0.0000000 0.0000000
# 5     5  0.8403361  2.521008 0.0000000  0.000000 0.0000000 0.0000000

fill = 0确保使用0而非默认NA

填充缺失值