簡體   English   中英

如何按R中的值選擇行?

[英]How do I select rows by their values in R?

我在R中有一個表,具有以下結構:

ID var1 var2 var3 .... varN
AA  1    2    1          3
AB  0.2  1    4          1

...

如何只選擇那些var1<2var2<2var3<2且...... varN<2

由於您的示例不可重現,我自己做了:

x <- data.frame(x1 = 1:4, x2 = 2:5, x3 = 3:6, x4 = c(1,6,3,12))
#-----
  x1 x2 x3 x4
1  1  2  3  1
2  2  3  4  6
3  3  4  5  3
4  4  5  6 12

根據您的標准,我認為我們應該選擇第2行和第4行。這段代碼適合您:

x[apply(x, 1, function(z) all(diff(z) > 0)),]
#-----
  x1 x2 x3 x4
2  2  3  4  6
4  4  5  6 12

如果數據位於data.frame DF中:

DF[rowSums(DF) == sum(2 * dim(DF)[2]), ]

如果你的數據幀是dat ,那么一行中所有元素的測試都小於2,並且只返回那些行:

dat[ apply( apply(dat[-1], 1, "<" ,2) , 2, all ), ]

邏輯:內部apply返回一個邏輯矩陣:

apply(dat[-1], 1, "<" ,2)
     [,1]  [,2]  [,3]
var1 TRUE  TRUE  TRUE
var2 TRUE FALSE  TRUE
var3 TRUE  TRUE FALSE
varN TRUE FALSE  TRUE

請注意,它是按維度轉置的,因為R矩陣是按列主要順序構造的,因此外部apply適用於列,因此使用2作為INDEX來應用all函數。 測試:

 dat <- read.table(text="ID var1 var2 var3  varN
 BA  1  1  1  1
 AA  1    2    1          3
 AB  0.2  1    4          1", header=TRUE)

 dat[ apply( apply(dat[-1], 1, "<" ,2) , 2, all ), ]
#  ID var1 var2 var3 varN
#1 BA    1    1    1    1

如果我理解你的問題,至少有兩種方法可以做你想要的(除了那些已經指定的方法。第一種是which()命令。基於你的查詢:

datasetname[which((datasetname$var1<2) & (datasetname$var2<2) & ... ]

應該返回你想要的行。 所以將

newdatasetname <- subset(datasetname, datasetname$var1<2 & ...)

只需在R中鍵入?subset?which就可以找到有關這些命令的更多信息。

這樣做:

dat[rowSums(dat[,-1] >= 2) == 0,]

測試:

dat <- read.table(text=
"ID var1 var2 var3  varN
 BA  1     1   1    1
 AA  1     2   1    3
 AB  0.2   1   4    1", header=TRUE)
dat[rowSums(dat[,-1] >= 2) == 0,]
#  ID var1 var2 var3 varN
#1 BA    1    1    1    1

暫無
暫無

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

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