2016-02-05 120 views
1

我有兩個來自10個人的數據集。一個是矢量,另一個是矩陣。我想看到的是矢量的第一個元素是否包含在矩陣的第一行中,以及矢量的第二個元素是否包含在矩陣的第二個行中,依此類推。r中的向量和矩陣之間的明智行比較

因此,我將矢量更改爲矩陣,並使用apply將它們按行進行比較。但是,結果並不正確。

這裏是數據集。

df1<-matrix(c(rep(0,10),2,4,7,6,5,7,4,2,2,2),ncol=2) 
df1 
#  [,1] [,2] 
# [1,] 0 2 
# [2,] 0 4 
# [3,] 0 7 
# [4,] 0 6 
# [5,] 0 5 
# [6,] 0 7 
# [7,] 0 4 
# [8,] 0 2 
# [9,] 0 2 
#[10,] 0 2 

df2<-c(1,3,6,4,1,3,3,2,2,5) 
df2<-as.matrix(df2) 
apply(df2, 1, function(x) any(x==df1)) 
# [1] FALSE FALSE TRUE TRUE FALSE FALSE FALSE TRUE TRUE TRUE 

但是,結果必須是全部FALSE,但第8和第9。 任何人都可以更正該功能嗎?謝謝!

回答

3

這裏有幾個方法,你可以採取

  1. 兩個電話申請

    # 
    # 1 by column to check if the values are equal 
    # then by row to see if any rows contain TRUE 
    apply(apply(df1,2,`==`,df2),1,any) 
    
  2. 使用sapply和seq_along

    sapply(seq_along(df2), function(x, y, i) y[i] %in% x[i, ], y = df2 ,x = df1) 
    
  3. 重複DF2相同的長度df1然後比較

    rowSums(df1==rep(df2, length = length(df1))) > 0 
    
+0

你是一個寶石!非常感謝您 –

4

這種量化代碼應該是非常有效的:

> as.logical(rowSums(df1==df2)) 
[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE TRUE FALSE 
+0

這應該是被接受的答案。我總是忘記矩陣被填充/比較列明 – thelatemail

+0

我得到'錯誤在df1 == df2:不符合數組',你碰巧知道爲什麼? – Laterow

+1

因爲df2是data.frame並具有維度。 'as.logical(rowSums(df1 == as.numeric(df2)))'應該可以工作。 –