这个问题在这里已有答案:
我有一个数据框有三个类别,学生成绩(成绩),学生报告的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
请注意,除了“N”之外,所有等级都缺少“容易度”(等级)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代码查找“1”级别,即使它们可能在频率表中丢失。是否应事先将“1”级别和0%的百分比引入表中,还是以某种方式自动化? (通过ifelse检查)
你可以使用dcast
包中的reshape2
:
library(reshape2)
dcast(df, formula="level~grade", fill=0, value.var="percentage")
使用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
填充