簡體   English   中英

將數據框的行與R中的矩陣行進行比較

[英]Compare rows of a data frame with a matrix rows in R

我創建了一個像這樣的矩陣:

> head(matrix)
     Var1 Var2 Var3 Var4 Var5 Var6 Var7 Var8 Var9 Var10 Var11
[1,] "0"  "0"  "1"  "0"  "1"  "1"  "0"  "0"  "0"  "0"   "NA"  
[2,] "1"  "0"  "1"  "0"  "1"  "1"  "0"  "0"  "0"  "0"   "NA"  
[3,] "0"  "1"  "1"  "0"  "1"  "1"  "0"  "0"  "0"  "0"   "NA"  
[4,] "1"  "1"  "1"  "0"  "1"  "1"  "0"  "0"  "0"  "0"   "NA"  
[5,] "0"  "0"  "2"  "0"  "1"  "1"  "0"  "0"  "0"  "0"   "NA"  
[6,] "1"  "0"  "2"  "0"  "1"  "1"  "0"  "0"  "0"  "0"   "NA"

現在,我想將上面的矩陣與以下數據框進行比較:

> head(df)
       cod Var11 Var1 Var2 Var3 Var4 Var5 Var6 Var7 Var8 Var9 Var10     Var12
1  C000354     B    1    1    4    0    1    2    0    0    0     1  51520.72
2  C000404     A    1    0    1    0    4    4    0    0    1     1  21183.25
3  C000444     A    1    0    4    1    3    3    0    0    0     1  67504.74
4  C000480     A    1    1    2    0    2    3    0    0    1     1  26545.92
5  C000983     C    1    0    1    0    3    4    0    0    0     0  10379.37
6  C000985     C    1    0    3    1    3    4    0    0    0     0  18660.99

矩陣包含變量Var1 Var2 Var3 Var4 Var5 Var6 Var7 Var8 Var9 Var10所有可能組合,因此基本上當df行(僅從VAR1VAR10列)與matrix行匹配並且df中的該行具有Var12>=90000 ,我希望它在matrix相應列VAR11中寫為"A"

我已經嘗試過:

for (i in 1 : nrow(matrix)) {
  for (j in 1 : 10) {
    ifelse(matrix[i,j]==df[,(j+2)]
           && df$Var12[] >= 90000,
           matrix[i,"Var11"] <- "A",
           matrix[i,"Var11"] <- "NA")
  }
}

但這會在矩陣的所有行中寫入NA

有誰知道為什么會這樣或如何解決呢?

提前致謝。

我不明白您為什么在循環中使用1:10和j + 2。

#Some dummy data
col_to_match<-paste0("V",1:10)
set.seed(123)
mat <- cbind(matrix(sample(0:4, 100, replace=TRUE), ncol=10), "NA")
colnames(mat)<-c(col_to_match,"V11")
set.seed(123)
df<- data.frame("cod"=paste0("C",1:20), "V12"= runif(20,min=88000,max=95000))
set.seed(1)
df <- cbind(df, rbind(mat[3:10,col_to_match], matrix(sample(0:4, 120, replace=TRUE), ncol=10))  )

從虛擬數據中,我們期望矩陣c(3:10)[df[1:8,"V12"]>=90000]行匹配虛擬數據。 這些是3 4 5 6 7 9 10

運行以下命令檢查矩陣中的每一行,找到df中是否有任何匹配的行,以及V12值是否大於90000。

for(i in 1:nrow(mat)){
  hasMatch<-any(sapply(1:nrow(df), function(j) all( df[j,col_to_match] == mat[i, col_to_match] ) && df[j,"V12"]>=90000 ))
  if(hasMatch) mat[i, "V11"]<-"A"
}

產量

 > mat
      V1  V2  V3  V4  V5  V6  V7  V8  V9  V10 V11 
 [1,] "1" "4" "4" "4" "0" "0" "3" "3" "1" "0" "NA"
 [2,] "3" "2" "3" "4" "2" "2" "0" "3" "3" "3" "NA"
 [3,] "2" "3" "3" "3" "2" "3" "1" "3" "2" "1" "A" 
 [4,] "4" "2" "4" "3" "1" "0" "1" "0" "3" "3" "A" 
 [5,] "4" "0" "3" "0" "0" "2" "4" "2" "0" "1" "A" 
 [6,] "0" "4" "3" "2" "0" "1" "2" "1" "2" "0" "A" 
 [7,] "2" "1" "2" "3" "1" "0" "4" "1" "4" "3" "A" 
 [8,] "4" "0" "2" "1" "2" "3" "4" "3" "4" "0" "NA"
 [9,] "2" "1" "1" "1" "1" "4" "3" "1" "4" "2" "A" 
[10,] "2" "4" "0" "1" "4" "1" "2" "0" "0" "2" "A" 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM