我有以下数据框
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
中执行此操作,还是应该更好地编写专用函数?
任何有关哪个命令或任何提示的建议都将受到赞赏。
答案 0 :(得分:2)
您正在寻找expand.grid
和merge
。这是你做的。
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