2016-06-14 43 views
2

我有一個數據幀,看起來像這樣的所有元素:提取物行名稱的基礎上,在一排小於某一值

a <- c(1.2,1.19,1.1,1.09,1.09) 
b <- c(1.2, 1.18,1.12,1.11, 1.09) 
d<- data.frame(a,b) 
rownames(d) <- c('450','500','899','1004','1112') 

     a b 
450 1.20 1.20 
500 1.19 1.18 
899 1.10 1.12 
1004 1.09 1.11 
1112 1.09 1.09 

我想寫的是將一個簡短的函數或一個班輪返回該行的所有值(在此例中爲值爲ab)的行的行名是全部小於值1.1。該數據框的最後一行只滿足該條件,行名稱爲1112。請注意,該解決方案必須進行推廣,以便可以對更多列和更多行的數據幀進行操作。

回答

5

這是爲了獲得所希望的結果的一般情況下,向量化方式:

rownames(d[rowSums(d < 1.1) == ncol(d),]) 
#[1] "1112" 
+0

一種替代'row.names(d)[ rowSums(d <1.1)== ncol(d)]'應該更有效率,因爲它不必首先對數據框進行子集劃分? – Psidom

+0

@Psidom有趣的選擇。可能值得檢查是否有差異。邏輯子集通常很「快」,我懷疑這是在你的情況下「引擎蓋下」完成的,但我不確定。 – RHertel

+3

或'row.names(d)[rowSums(d> = 1.1)== 0L]' –

3

此功能使用apply應該工作:

rownames(d)[apply(d, 1, function(x) all(x < 1.1))] 

這裏,rownames正在使用邏輯矢量子集。 apply循環遍歷每行,並使用all檢查所有條目是否小於1.1。

你可以在一個函數,如下所示包住此:

row.checker <- function(df, value) { 
    rownames(df)[apply(df, 1, function(x) all(x < value))] 
} 
相關問題