2017-10-05 3 views
0

マイデータフレーム:I:ケースAとQA(=品質A)についてR - 奇数の特定の列の値に基づいて特定の偶数列内の値を置換する - 全体データフレームに適用

data <- data.frame(A = c(1,5,6,8,7), qA = c(1,2,2,3,1), B = c(2,5,6,8,4), qB = c(2,2,1,3,1)) 

desired_data <- data.frame(A = c("NA",5,6,"NA","NA"), qA = c(1,2,2,3,1), B = c(2,5,"NA","NA","NA"), qB = c(2,2,1,3,1)) 
:品質値1および3に割り当てられた値が、最終的なデータは次のようにする必要があり、ケースBのためのNA

と同じとQB

に置き換えられたいです

私の質問はそれを実行する方法ですか?

私は約90列の大きなデータフレームを持っているので、列名が正しく動作するようにするコードが必要です。手助けする

、Iは「Q」の文字で始まる列を選択し、コードのこの部分を有する:

data[,grep("^[q]", colnames(data))] 

答えて

0

...

data[,seq(1,ncol(data),2)][(data[,seq(2,ncol(data),2)]==1)| 
          (data[,seq(2,ncol(data),2)]==3)] <- NA 

data 
     A qA  B qB 
1 NA  1  2  2 
2  5  2  5  2 
3  6  2 NA  1 
4 NA  3 NA  3 
5 NA  1 NA  1 
+0

ありがとうアンドリュー:それは動作し、それは非常に高速です! – Loulou

0

一つの解決策は、2つのテーブル内の別個の基地Rに

をベクトル化を使用することですあなただけのこの操作を行うことができ
data <- data.frame(A = c(1,5,6,8,7), qA = c(1,2,2,3,1), B = c(2,5,6,8,4), qB = c(2,2,1,3,1)) 
data 
#> A qA B qB 
#> 1 1 1 2 2 
#> 2 5 2 5 2 
#> 3 6 2 6 1 
#> 4 8 3 8 3 
#> 5 7 1 4 1 

quality <- data[,grep("^[q]", colnames(data))] 
data2 <- data[,setdiff(colnames(data), names(quality))] 

data2[quality == 1 | quality == 3] <- NA 
data2 
#> A B 
#> 1 NA 2 
#> 2 5 5 
#> 3 6 NA 
#> 4 NA NA 
#> 5 NA NA 
関連する問題