簡體   English   中英

根據R中的多列選擇行

[英]Selecting rows based on multiple columns in R

我有一個這樣的數據框

 M2 <- matrix(c(1,0,0,1,1,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0),nrow=7, 
  dimnames=list(LETTERS[1:7],NULL)) 

我想選擇基於多個列的行。 例如,當我只想基於兩列選擇行時,

 ans<-M2[which(M2[,1]==0 & M2[,2]==0)

但是,當我只想基於三或四列(例如,基於第1、3和4列)或說有1,2,3,4來選擇值為零的行時,該怎么做?

只是為了好玩,一個適用於data.frame的解決方案可以用於大量列:

DF <- as.data.frame(M2)
DF[rowSums(sapply(DF[,c(1,2,4)],`!=`,e2=0))==0,]
#  V1 V2 V3 V4
#B  0  0  0  0
#F  0  0  0  0
#G  0  0  0  0

這里會發生什么?

  1. sapply在子集DF[,c(1,2,4)]的列上循環。 它將函數!= (不等於)應用於子集的每一列,並與0比較( e2!=函數的第二個參數)。 結果是邏輯值矩陣(TRUE / FALSE)。
  2. rowSums獲取此邏輯矩陣每一行的總和。 邏輯值將自動強制為1/0。
  3. 然后,我們測試這些行總和是否為0(即行中的所有值均不等於0)。
  4. 所得邏輯向量用於子集行。

當然,使用矩陣更容易,更快捷:

M2[rowSums(M2[,c(1,2,4)] != 0) == 0,]

您可以使用rowSums:

M2[rowSums(M2[,c(1,2,3,4)]) == 0,]

為您提供第1,2,3和4列為零的所有行:

  [,1] [,2] [,3] [,4]
B    0    0    0    0
F    0    0    0    0
G    0    0    0    0

請注意,如果矩陣中有正數和負數,則此功能將無效。

您的問題對我來說不是很清楚,但這是您要找的東西嗎?

要基於第1到第4列的值進行選擇,請執行以下操作:

ans <- M2[M2[,1]==0 & M2[,2]==0 & M2[,3]==0 & M2[,4]==0,]

 #> ans
 #  [,1] [,2] [,3] [,4]
 #B    0    0    0    0
 #F    0    0    0    0
 #G    0    0    0    0

這將導致M2的子集,其中所有列1至4均為零。

暫無
暫無

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

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