2017-08-16 21 views
3

我有以下的df和用例,我想找到並設置一些東西在所有行中存在的另一行滿足條件,例如數據框:如何將當前行與其他行進行比較而不循環?

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 

我想找到衛生組織Y值的那些行是相同另一行 X值。在上面的例子中,行#2是真的,因爲Y = c和行#3具有X = c。請注意,第1行不符合條件。

喜歡的東西:

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

是項每一列中是唯一的? – Frank

+0

澄清:如果我們有另一行'df [4,] = e a'那麼第1行是包含還是排除的解決方案? – dww

回答

3

對於每個Y,我們會檢查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

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

基本上你想知道Y是否X但你想要的條件是FALSEX == Y

df$Z <- with(df, (Y != X) & (Y %in% X)) 
相關問題