2013-04-18 71 views
0

我想根據某些條件從數據框中選擇行。我通常使用% in %運算符來選擇值。我使用了許多%in%來選擇值。在運算符中結合了2個或更多個R

val1 <- portData [portData$PmkVal %in% c(NA),] 
    val2 <- val1 [val1$Quantity %in% c(NA),] 
    weigtageData <- val2 [val2$MktVal %in% c(NA),] 

我可以寫在一行中的所有這些聲明和框架portData本身,而不是寫這個低效的代碼選擇數據?

+1

如果我理解正確,您試圖在'portData'中的變量'PmkVal'和'Quality'中刪除NA?如何'portData [is.na(portData $ PmkVal)&is.na(portData $ Quality)&is.na(portData%MktVal),]'? –

+0

waaw,..多數民衆贊成在一個好主意..感謝:) –

回答

4

首先,當您檢查NA時,您可以使用漂亮的便捷功能is.na(.)。也就是說,

val1 <- portData [is.na(portData$PmkVal), ] 
val2 <- val1[is.na(val1$Quantity), ] 
weigtageData <- val2[is.na(val2$MktVal), ] 

現在,你可以使用&連接所有這些在一個單一的命令如下:

weigtageDate <- portData[is.na(portData$PmkVal) & 
         is.na(portData$Quantity) & 
         is.na(portData$MktVal), ] 

甚至更​​好的是在這裏使用with,使你不必每次都使用portData$

weigtageData <- portData[with(portData, is.na(PmkVal) & 
          is.na(Quantity) & is.na(MktVal)), ] 

當然,這也轉換爲%in%。這裏沒有必要。

1

另外一個選擇是使用complete.cases功能,如果你檢查NA的:

test <- matrix(sample(20),ncol=5) 
colnames(test) <- c("A","B","C","D","E") 

test[2,1] <- NA 
test[3,1] <- NA 
test[4,2] <- NA 

test[complete.cases(test),] 
test[complete.cases(test[,2]),] 
test[complete.cases(test[,c(1,2)]),] 

編輯:爲了保持只行裏面缺失值,你已經通過!像反轉召喚:

test[!complete.cases(test),] 
+1

這很好,但是,你可能要*否定*輸出。 OP希望*保留其中包含NA的列。 – Arun

+0

啊,你說得對,對不起!我會相應地編輯我的帖子。 –