我有一个包含三个类别的数据框:学生成绩(成绩),学生报告的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检查)
答案 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