0

次のデータフレームがあります。

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")

Ni = 1そして、、、Zn = 1および。のすべての種を含むベクトルを取得したいと思いCu = NAます。したがって、この例では(1,4)になります

Rスクリプトを試してみることができると思いましたが、select * from whereRMySQLパッケージをRStudio(Rバージョン2.15.1)にインストールできないようです。

4

4 に答える 4

4
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")

with(df, Species[Ni %in% 1 & Zn %in% 1 & Cu %in% NA])
[1] 1 4

前者はである要素を返すため、を使用するのではなく、を使用Ni == 1する必要があります。と同じ結果を生成します。Ni %in% 1NANiNACu %in% NAis.na(Cu)

with(df, Species[Ni == 1 & Zn %in% 1 & Cu %in% NA])
[1] 1 NA 4

@MadSconeの回答のように、でNi == 1使用されているものはこれに悩まされていないことに注意してください(これは私にとって驚きでした)。subset

subset(df, Ni == 1 & Zn == 1 & is.na(Cu), Species)
  Species
1       1
4       4
于 2012-11-05T13:10:34.340 に答える
2

サブセット()を見てください。

x <- 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")

subset(x, Ni == 1 & Zn == 1 & is.na(Cu), Species)
于 2012-11-05T13:11:30.160 に答える
0

編集:
私は修正されたBacklinままです...よりも使用する方
はるかに良いです!の使用の提案は、出力に1つの列のみを選択した場合でも、結果がdata.frameのままであるため、さらに優れています。%in%== x & !is.na()
MadSconesubset()

> 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
于 2012-11-05T13:20:09.433 に答える
0
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")

列、、、およびが含まれている場合NiのみZnCu1NA使用できます。

subset(df, Ni & Zn & is.na(Cu), Species)
于 2012-11-05T14:53:20.070 に答える