2012-06-21 42 views
1

我有R A表具有以下結構:如何按R中的值選擇行?

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

...

我怎麼可以只選擇那些行,其中var1<2var2<2var3<2和... varN<2

回答

1

如果您的數據框爲dat測試對於一行中的小於2和retruning只有那些行的所有元素是:

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

邏輯:內應用返回的邏輯矩陣:

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矩陣構成列主要順序,所以外部應用需要在列上工作,因此使用2作爲應用all函數的INDEX。測試:

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 
+0

謝謝!它和我需要的完全一樣! – annndrey

1

如果數據是在data.frame DF:

DF[rowSums(DF) == sum(2 * dim(DF)[2]), ] 
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 
+0

也許我誤解你的標準,我想你想行,其中'VAR1 Chase

+0

我認爲你是對的,我只是沒有耿耿於懷。我會刪除我的答案。在第二次讀取時,OP希望行的所有值小於2.所以在他們的示例中不會返回行......我認爲 – Justin

+0

@Justin - 我不確定我們哪個人回答了正確的問題。我建議保留你的答案,因爲我認爲它非常漂亮,即使它不完全是OP所要的 - 顯示了一些有效的邏輯實現。 – Chase

0

如果我明白你的問題,至少有兩種方法可以做到你想要什麼(除了已作規定的首先是which()命令基於查詢:

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

應該返回所需的行,因此將

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

只需鍵入?subset和R中?which,以瞭解更多有關這些命令。

+2

我知道這種子集數據的方式,但想法是選擇所有行使用他們的名字,因爲我的數據幀是相當大的,我發現有點厭倦列出所有的行。 – annndrey

0

這將做到這一點:

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