Начиная с:
> data
var1 var2 var3 user
1 1 NA 2 bob
2 34 3 1 bob
3 NA NA 2 bob
4 1 2 3 lisa
5 1 NA 2 lisa
6 3 4 5 joe
7 6 NA 4 simon
сначала вычислите показатель полноты, суммируя количество значений, не относящихся к NA, в var1 к var3:
> data$score = apply(data[,c("var1","var2","var3")],1,function(x){sum(!is.na(x))})
> data
var1 var2 var3 user score
1 1 NA 2 bob 2
2 34 3 1 bob 3
3 NA NA 2 bob 1
4 1 2 3 lisa 3
5 1 NA 2 lisa 2
6 3 4 5 joe 3
7 6 NA 4 simon 2
Затем найдите строку с max (оценка) в каждой группе. Вероятно, есть более простой способ сделать это:
> pick = unlist(tapply(1:7,data$user,
function(x){x[data[x,"score"]==max(data[x,"score"])]}))
> pick
bob joe lisa simon
2 6 4 7
> data[pick,]
var1 var2 var3 user score
2 34 3 1 bob 3
6 3 4 5 joe 3
4 1 2 3 lisa 3
7 6 NA 4 simon 2
Если у кого-то есть две строки с одинаковым счетом, они появятся дважды:
> data[2,'var2']=NA
> data$score = apply(data[,c("var1","var2","var3")],1,function(x){sum(!is.na(x))})
Теперь, если я пересчитаю , выберу Я получу Боб дважды:
> pick = unlist(tapply(1:7,data$user,
function(x){x[data[x,"score"]==max(data[x,"score"])]}))
> pick
bob1 bob2 joe lisa simon
1 2 6 4 7
Что можно исправить, просто вернув первое совпадение в расчете пика:
> pick = unlist(tapply(1:7,data$user,
function(x){x[data[x,"score"]==max(data[x,"score"])][1]}))
> pick
bob joe lisa simon
1 6 4 7
Вы не сказали, что хотели делать с дубликатами ...
Кто-то, вероятно, разместит однострочник в тике ...