我想根据某些条件从数据框中选择行。我通常使用% in %
运算符选择值。我使用了很多%in%
来选择值。
val1 <- portData [portData$PmkVal %in% c(NA),]
val2 <- val1 [val1$Quantity %in% c(NA),]
weigtageData <- val2 [val2$MktVal %in% c(NA),]
我可以在一行中编写所有这些语句并从帧portData
本身中选择数据,而不是编写这个效率低下的代码吗?
答案 0 :(得分: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 :(得分:1)
另一个选择是使用complete.cases
功能,如果您检查NA&#39>:
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),]