2012-01-08 8 views
0

私は参加者による複数回の試行があるオンライン調査データセットを持っており、行番号で複数のケースを選択的に削除する必要があります。データはdata.frameとして保存されます。私はこれを手動で行うことができることを認識していますが、必要に応じて後で使用できるように、これをスクリプトとして保持したい、または誰かが私がやったことを迅速かつ効率的に複製することができます。私は複数の場所で検索しましたが、私の質問は単純すぎるようだ:私は試してみました何data.frame内の特定のベクトルに基づいて行を削除するにはどうすればよいですか?

。私は不完全なケース( 'complete.cases'と 'na.omit')に基づいて行を削除する方法を見てきましたが、特にdata.frame内の特定のベクトルに基づいて行を削除しようとしています

データ:

user_id var1 var2 var3 
1   NA 13 bob 
3  time 37 fred 
4  second NA lisa 
5  second 28 lisa 

ので、上記data.frameに私は、ユーザーリサによって複数の試みを持っています。私は彼女の最後の試行を続行したいのですが、それはより完全であるため(var2にNAはありません)、var3ではなくuser_idに基づいて行を削除する必要があります。

+0

を持って、あなた特定のユーザ(var3)の1つを除くすべてのケースを削除したい場合、最初に欠落しているものを削除したいのですか? –

+0

したがって、 'completeness'はvar1とvar2の非NAsの数ですか? var3の各値に対して最も完全な行を保持したいのですか?だから、ボブはリサの最初の行程ほど不完全であったにもかかわらず、彼のエントリーは、彼が決して上手くいったことがないために残っていますか?それは正しいのでしょうか? – Spacedman

+0

はい、上記のデータから行4を削除したいのですが、それはuser_idです4。私は、いくつかのNAsを持つ行には関心がありませんが、調査を複数回試みた回答者による最も完全な試みを維持しています。 –

答えて

1

から開始:

> 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 

最初計算VAR3にVAR1非NA値の数を合計することによって完全スコア:

> 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 

誰かが同じスコアで2つの行を持っている場合、彼らは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 

あなたが重複してやって欲しかったと言っていなかった...

誰かが、おそらく明確にするために...ワンライナーはチックに掲載

+0

これはおかげです。それは私を方向に導いている。私は別のオプションは、私は私の説明に含める必要がありますユーザーと日付/時間でそれをフィルタにすることだと思う。 –

0
setwd("~/Stack Overflow") 
MultipleSurveys <- read.table("~/Stack Overflow/ ... 
MultipleSurveys.txt", header=T, quote="\"") 
SurvDat <- MultipleSurveys[,-ncol(MultipleSurveys)][,-1] 
NbNA <- rowSums(is.na(SurvDat)); names(NbNA) <- "NbNA" 
AMS <- cbind(MultipleSurveys,NbNA) 
minNA <- function(DT){ 
    NbSurv <- nrow(DT) 
    if (NbSurv==1) return(DT) 
    else{ 
    OldRow <- DT[1,] 
    for (r in 2:NbSurv){ 
     NewRow <- DT[r,] 
     if (NewRow$NbNA<=OldRow$NbNA) OldRow <- NewRow 
    } 
    return(OldRow) 
    } 
} 
(SingleSurveys <- by(AMS,AMS$user,minNA)) 
関連する問題