在r中,我正在尝试在这样的数据框架中进行采访分数:
Interviewer Applicant Score
Int_9 App_5 3
Int_3 App_3 2
Int_1 App_2 9
Int_3 App_5 2
...
和重新格式化:
AVG Int_1 Int_2 Int_3 ...
App_3 2.0 NA NA 2
App_5 2.5 NA NA 2
App_2 9.0 9 NA NA
...
这让我 close :
reshape(data, idvar="applicant", timevar="interviewer", direction="wide")
但是,访调员的名字并未按照我的意愿按字母顺序排序。我想我可以使用mean
和merge
函数获取AVG列,但是我不知道如何将AVG从低到高(并让其余的条目都出现在乘车上(。另外,我如何平均在所有申请人的分数上平均得分,而不必明确编写每个申请人的名称,即如何 not 必须这样做:
app_avg = c(mean(data$score[data$applicant=="App_1"]), mean(data$score[data$applicant=="App_2"]), mean(data$score[data$applicant=="App_3"]), ...)
帮助,请?
这是一个解决方案。
library(reshape)
library(tibble)
从"长"格式重新铸造数据:
> df1 <- cast(df0, formula = Applicant ~ Interviewer, value = "Score", add.missing = TRUE, fill = NA, fun.aggregate = sum)
Applicant Int_1 Int_2 Int_3 ...
1 App_5 NA NA 2
2 App_3 NA NA 2
3 App_2 9 NA NA
...
计算每行的平均值:
> df_avg <- data.frame(Applicant = df1[,1], AVG = rowMeans(df1[,-1], na.rm=TRUE))
Applicant AVG
1 App_3 2.5
2 App_5 2.0
3 App_2 9.0
插入申请人和int_1之间的行均值:
> df2 <- add_column(df1, AVG=df_avg[,2], .before = "Int_1")
Applicant AVG Int_1 Int_2 Int_3 ...
1 App_5 2.5 NA NA 2
2 App_3 2.0 NA NA 2
3 App_2 9.0 9 NA NA
...
基于AVG列的重新排序行:
> df3 <- df2[order(df2$AVG),]
Applicant AVG Int_1 Int_2 Int_3 ...
2 App_3 2.0 NA NA 2
1 App_5 2.5 NA NA 2
3 App_2 9.0 9 NA NA
...
renumber行名称为连续数字:
> rownames(df3) <- NULL
Applicant AVG Int_1 Int_2 Int_3 ...
1 App_3 2.0 NA NA 2
2 App_5 2.5 NA NA 2
3 App_2 9.0 9 NA NA
...