2015-09-29 70 views
1

我想根據第2列和第3列是否包含0來刪除行。我不斷得到非常奇怪的結果。我最初試圖在沒有subset的情況下編寫它,因爲我在某處讀取subset應該只用於少量數據,因爲內存成本。然而,這兩種嘗試都不適合我。有人能解釋我做錯了什麼嗎?基於多個列值獲取數據的子集

df<-data.frame(val1=c(1,2,3),val2=c(4,0,5),val3=c(3,0,6)) 
subset(df,df>0,c(2,3)) 
data.frame(df[df[,c(2,3)]!=0]) 

最終目標:

val1 val2 val3 
1 1  4  3 
3 3  5  6 

回答

3

使用subset,我們創建一個基於第二和第三列的邏輯索引。

subset(df, subset=!(val2==0|val3==0)) 

as subset參數適用於列而不適用於矩陣。 我們也可以使用[而不是subset

關於在OP的帖子

df[,c(2,3)]!=0 #returns a matrix 
#  val2 val3 
#[1,] TRUE TRUE 
#[2,] FALSE FALSE 
#[3,] TRUE TRUE 

對於子集化行的第二個答案,我們只需要每每行一個單一的邏輯索引。


另一種選擇是rowSums(如果你想刪除,對於這兩種列2 0行3)

df[rowSums(df[2:3])!=0,] 

df$val3[2] <- 2 

將返回rowSums所有行而其他方法返回第1行和第3行。

等效選項與subset&

subset(df, !(val2==0 & val3==0)) 
-1
require(dplyr) 
df %>% filter(val2!=0 & val3!=0) ... 
相關問題