2017-05-08 11 views
3

私は2つのデータフレームを持っています。別のデータフレームの対応する行に特定の値を持つデータフレーム内の行を削除

私の実際のデータを保持しています、データと呼ぶことができます。 2番目はインジケータ行列として機能し、少なくとも1または2を含む値の行の出現をチェックするif-else文を使用して作成されます。の表示とすることができます。ここで

は一例です:見てから

remove<-function(x){ 

    if (((x[1] == "1") | (x[1] == "2")) | ((x[2] == "1") | (x[2] == "2")) 
     | ((x[3] == "1") | (x[3] == "2")) | ((x[4] == "1") | (x[4] == "2"))){ 
    return(0) 
    } 

else{ 
    return(1) 
} 
} 

indic<-data.frame(apply(data,1,remove)) 

> indic 
     y 
1  0 
2  1 
3  0 
4  1 
5  0 

データ

col1<-c(1,3,1,3,2) 
col2<-c(3,4,2,3,"") 
col3<-c(1,3,"","","") 
col4<-c(2,"","","","") 

data<-data.frame(cbind(col1,col2,col3,col4)) 

> data 
    col1 col2 col3 col4 
    1 3 1 2 
    3 4 3  
    1 2   
    3 3   
    2 

行がが含まれている必要があり、少なくとも1または2ので、ここで私の関数でありますデータであり、行2および行4は、少なくとも1または2を含まず、標識によって確認される。

Iはインドの行2及び4に対応データ、の行2及び4を除去したいです。私はすでに次のことを試してみました:

finalMatrix<-class(array) 

for(i in 1:nrow(indic)){ 
    if (indic[i,1] == "1"){ 
    finalMatrix = data[-i,] 
    } 
    else{ 
    data[i,] = data[i,] 
    } 
} 

しかし、私の出力は、このようなものです:

> finalMatrix 
    col1 col2 col3 col4 
    1 3 1 2 
    3 4 3  
    1 2     
    2  

効果的ONLY 4行目を排除します。私は、各反復後に新しいデータフレームを作成しなければならないという事実と関連があるかもしれないと思うが、問題は反復の長さが変わることである。

私のコードで正しい軌道に乗っているかどうかわかりません...どのような提案も素敵でしょう。私はこれをしばらく思ってきました。

-Soph

+3

私はその質問を理解していません。 'finalMatrix < - data [indic!=" 1 "、]'のようなものが欲しいですか? – Vandenman

+1

'finalMatrix < - data [which(indic == 0)、]'この場合にも可能です。 –

+1

'data [rowSums(data ==" 1 "| data ==" 2 ")> ] '?あなたは正しくベクトル化を使用しておらず、 'for'ループは非常に効率が悪いです。また、あなたの価値を「性格」に強要する理由はないようです。欠損値には「NA」を使用します。 – nicola

答えて

1

あなたが代わりに0/1を含んで、あなたのインド語、ベクトル、のTRUE/FALSE vetorを生成しようとすることができます。これにより、最終的なフィルタリングがより明確になります。

> data 
    col1 col2 col3 col4 
1 1 3 1 2 
2 3 4 3  
3 1 2   
4 3 3   
5 2   

anyの使用は、あなたの1または2の行のコンテンツに簡単にアクセスできるようになります。 2つ目の条件の1つが満たされた場合は、2番目のanyが表示されます。すべての行通じapply()ランは、二番目のパラメータは、あなたの質問のタイトルとして1

indic <- apply(data, 1, function(row) { 
    any(c(any(row == 1), any(row == 2))) 
}) 


> indic 
[1] TRUE FALSE TRUE FALSE TRUE 

> data[indic,] 
    col1 col2 col3 col4 
1 1 3 1 2 
3 1 2   
5 2 

に設定されている場合には、インド語、ベクターはまた、別のデータフレームに適用される可能性が示唆が、ここでは、することが重要です同一の寸法を有するデータフレーム及びインジケータベクトル又はベクトルリサイクルを目指すことを注意する。

ベクトル化を使用する@ nicolaの提案を受け取ります。

data[rowSums(data=="1" | data=="2")>0,] 

これにより、ループを最も効率的に節約し、indicを作成することができます。 rowSums(data=="1" | data=="2")>0から出力されるTRUE/FALSEベクタは変数に保存できます。

関連する問題