[英]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<2
且var2<2
且var3<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.