2017-08-16 8 views
3

私は以下を持っていますdfとユースケース、私は見つけて、条件を満たす別の行が存在するすべての行に何かを設定したいと思います。 Iは、Y値玉葉これらの行を検索したいデータフレーム:現在の行をループなしで他の行と比較するには?

df <- data.frame(X=c('a','b','c'), Y=c('a','c','d')) 
> df 
    X Y 
1 a a 
2 b c 
3 c d 

別の行におけるX値と同じです。上の例では、Y = cと行#3がX = cであるため、行#2が真となります。行1は条件を満たしていないことに注意してください。等

何か:各Yについて

df$Flag <- find(df, Y == X_in_another_row(df)) 
+0

エントリは各列内で一意ですか? – Frank

+0

説明のために:別の行 'df [4、] = e a'がある場合、行1はインクルードされたソリューションか除外されるソリューションですか? – dww

答えて

3

(同じ行以外)Xの任意の値が一致する場合、我々は確認してください。

sapply(1:NROW(df), function(i) df$Y[i] %in% df$X[-i]) 
#[1] FALSE TRUE FALSE 

インデックスが必要な場合は、which

which(sapply(1:NROW(df), function(i) df$Y[i] %in% df$X[-i])) 
#[1] 2 

で全体を包んで(十分にテストされていない)

​​
+2

ループなし...? –

1
which(match(df$Y,df$X)!=1:nrow(df)) 
+0

うわー!興味深い解決策...自己封じ込めについての説明? –

+0

私は実際にはそれが動作することを確認していない...まだそれをテスト! – Lyngbakr

+0

私の手で作業していません... –

0
# Assume you want to use position 4, value 'c', to find all the rows that Y is 'c' 
df <- data.frame(X = c('a', 'b', 'd', 'c'), 
       Y = c('a', 'c', 'c', 'd')) 


row <- 4 # assume the desire row is position 4 

val <- as.character(df[(row),'X']) # get the character and turn it into character type 

df[df$Y == val,] 
# Result 
# X Y 
# 2 b c 
# 3 d c 
1

私は、これは動作するはずだと思います。

df <- data.frame(X= c(1,2,3,4,5,3,2,1), Y = c(1,2,3,4,5,6,7,8)) 
which(with(df, (X %in% Y) & (X != Y))) 

元data.frameに取り組んでいます、私たちはstringsasfactorsを設定している場合= FALSE

df <- data.frame(X=c('a','b','c'), Y=c('a','c','d'), stringsAsFactors = F)  
which(with(df, (X %in% Y) & (X != Y))) 
1

かなり複雑しかし、私はとにかくそれをここに入れます。これは、次のデータフレームdf2で例えばX. の値が繰り返されていても動作するはずです:

df2 = data.frame(X=c('a','b','c','a','d'), Y=c('a','c','d','e','b')) 
    X Y 
1 a a 
2 b c 
3 c d 
4 a e 
5 d b 


## Specifying the same factor levels allows us to get a square matrix 
df2$X = factor(df2$X,levels=union(df2$X,df2$Y)) 
df2$Y = factor(df2$Y,levels=union(df2$X,df2$Y)) 
m = as.matrix(table(df2)) 
valY = rowSums(m)*colSums(m)-diag(m) 
which(df2$Y %in% names(valY)[as.logical(valY)]) 
[1] 1 2 3 5 
1

は基本的にあなたがYXにあるかどうかを知りたいが、あなたは条件になりたいFALSEX == Y

df$Z <- with(df, (Y != X) & (Y %in% X)) 
関連する問題