2017-12-06 15 views
4

同じ行にも2番目の列に一定の値がある場合のみ、少なくとも1つの行が1に等しい列を選択しようとしています。私はこれをdplyrを使って実現する方が好きですが、計算上効率的なソリューションは大歓迎です。dplyrを使用して複数の列の行値に基づいて列を選択

例:

rand <- function(S) {set.seed(S); sample(x = c(0,1),size = 3, replace=T)} 
df <- data.frame(a1=rand(1),a2=rand(2),a3=rand(3),b=c("A","B","A")) 
:値が1とカラムB == "B"

例のデータであり、A3は、少なくとも一つの列を含む

選択列A2、A1のうち、

入力データ:

a1 a2 a3 b 
1 0 0 0 A 
2 0 1 1 B 
3 1 1 0 A 

所望の出力:

私は以下のコードで正しい出力を得ることができましたが、これは非常に非効率的な解決策であり、非常に大きなデータフレーム(365,000行×314列)で実行する必要があります。

df %>% select_if(function(x) any(paste0(x,.$b) == '1B')) 
+2

データを長い形式に変換してください。これが難しいと思うのは、ワイドフォーマットで計算しようとしているからです。 –

+0

@docendodiscimusヒントのおかげで、それは確かに簡単です! –

答えて

2

は私dplyrソリューションです:@ docendo-discimus長い形式

への変換が容易であることで示唆したように

ids <- df %>% 
    reshape2::melt(id.vars = "b") %>% 
    filter(value == 1 & b == "B") %>% 
    select(variable) 

df[,unlist(ids)] 

# a2 a3 
#1 0 0 
#2 1 1 
#3 1 0 

+0

完璧、ありがとう! –

2

ソリューション、dplyr使用していない:

ここ
df[sapply(df[df$b == "B",], function(x) 1 %in% x)] 
関連する問題