R重新格式化数据帧

时间:2018-02-05 01:10:14

标签: r reshape2

在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
...

这让我关闭

reshape(data, idvar="applicant", timevar="interviewer", direction="wide")

但是,面试官姓名不按字母顺序排序,因为我喜欢。我想我可以使用meanmerge函数来获取AVG列,但我不知道如何将AVG从低到高排序(并且其余条目都会出现)为了骑)。此外,如何在不必明确写出每个申请人的姓名的情况下平均所有申请人的分数,即如何必须这样做:

app_avg = c(mean(data$score[data$applicant=="App_1"]), mean(data$score[data$applicant=="App_2"]), mean(data$score[data$applicant=="App_3"]), ...)

请帮帮忙?

1 个答案:

答案 0 :(得分:0)

这是一个解决方案。

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
...

将行名重新编号为连续数字:

> 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
...