根据缺失的类别插入NA值的方法

时间:2015-01-14 13:23:35

标签: r

我有以下数据框

  Author   Score   Value
  A        High    10
  B        Low     20
  C        Medium  30
  A        Low     15
  B        Medium  22

我想重新排列数据框,以显示作者在其中一个可能的分数中没有得分。

我想为作者插入一个条目,以便显示NA

  Author   Score   Value
  A        Low     15
  A        Medium  NA
  A        High    10
  B        Low     20
  B        Medium  22
  B        High    NA
  C        Low     NA
  C        Medium  30
  C        High    NA

是否有一种简单的方法,即命令在R中执行此操作,还是应该更好地编写专用函数?

任何有关哪个命令或任何提示的建议都将受到赞赏。

2 个答案:

答案 0 :(得分:2)

您正在寻找expand.gridmerge。这是你做的。

lvls <- expand.grid(lapply(df[, c('Author', 'Score')], levels))
merge(df, lvls, all=TRUE)

如果订单很重要,您可以

lvls <- expand.grid(lapply(df[, c('Author', 'Score')], levels))
df.new <- merge(df, lvls, all=TRUE)
df.new[, 'Score'] <- factor(df.new[, 'Score'], levels=c('Low', 'Medium', 'High'))
df.new[order(df.new$Author, df.new$Score), ]

如果您的data.frame没有factors,但有characters,您还可以使用以下更通用的功能。你仍然需要重新排序。

expand.df <- function(data, factors) {
  lvls <- expand.grid(lapply(data[, factors], function(x) {
    if (is.factor(x)) return(levels(x))
    else return(unique(x))
  }))
  return(merge(df, lvls, all=TRUE))
}
expand.df(df, c('Author', 'Score'))

答案 1 :(得分:2)

使用data.table

的选项
library(data.table)
df$Score <- factor(df$Score, levels=c('Low', 'Medium', 'High'))
setkey(setDT(df), Author, Score)[CJ(unique(Author), unique(Score))]
#   Author  Score Value
#1:      A    Low    15
#2:      A Medium    NA
#3:      A   High    10
#4:      B    Low    20
#5:      B Medium    22
#6:      B   High    NA
#7:      C    Low    NA
#8:      C Medium    30
#9:      C   High    NA