編集:
私は修正されたBacklin
ままです...よりも使用する方
がはるかに良いです!の使用の提案は、出力に1つの列のみを選択した場合でも、結果がdata.frameのままであるため、さらに優れています。%in%
== x & !is.na()
MadScone
subset()
> class(subset(df, Ni == 1 & Zn == 1 & is.na(Cu), Species))
[1] "data.frame"
#whereby we get a vector when only one column is selected...
> class(df[df$Ni %in% 1 & df$Zn %in% 1 & is.na(df$Cu), 1])
[1] "integer"
# but we get data.frame when using multiple columns...
> class(df[df$Ni %in% 1 & df$Zn %in% 1 & is.na(df$Cu), 1:2])
[1] "data.frame"
この代替イディオムについて言及するために、私は標準以下の答えを残しているだけです。
設定:
> df <- structure(list(Species = 1:4, Ni = c(1, NA, 1, 1), Zn = c(1,
1, 1, 1), Cu = c(NA, NA, 1, NA)), .Names = c("Species", "Ni",
"Zn", "Cu"), row.names = c(NA, -4L), class = "data.frame")
> df
Species Ni Zn Cu
1 1 1 1 NA
2 2 NA 1 NA
3 3 1 1 1
4 4 1 1 NA
クエリ:
> df[df$Ni == 1 & !is.na(df$Ni)
& df$Zn == 1 & !is.na(df$Zn)
& is.na(!df$Cu), ]
Species Ni Zn Cu
1 1 1 1 NA
4 4 1 1 NA
NA値の秘訣は、明示的に除外することです。たとえば、Ni、リクエスト値1、!is.na()などを使用します。そうしないと、たとえばNiがNAであるレコードが検索されます。
上で述べたように、 df[df$Ni %in% 1 & df$Zn %in% 1 & is.na(!df$Cu), ]
イディオムははるかに好ましく、subset()を使用する方が一般的にはまだ優れています。
> df[df$Ni == 1 & df$Zn == 1 & is.na(!df$Cu), ]
Species Ni Zn Cu
1 1 1 1 NA
NA NA NA NA NA # OOPS...
4 4 1 1 NA