2015-01-14 2 views
0

У меня есть следующий кадр данныхметода для вставки значений NA на основе отсутствующей категории

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

Я хотел бы изменить фрейм данных для отображения, что автор не имеет счета в одном из возможного «Score ».

Я хотел бы вставить запись для автора, чтобы появился 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

на самом деле это дубликат: http://stackoverflow.com/questions/26591748/r-adding-nas-into-data-frame/26592023#26592023 –

ответ

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')) 
+0

Фантастический материал! Он делает то, что я прицелился. Большое спасибо! –

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 
+2

Очень приятно. Я думаю, что имеет смысл вычислить значения 'unique' внутри. то есть, достаточно ли 'CJ (Author, Score)', чтобы автоматически возвращать уникальные комбинации. – Arun

+0

@Arun Спасибо за информацию. – akrun

+0

@Arun Ох хорошо. Я неправильно понял, извините. Да, это имеет смысл. – akrun

Смежные вопросы