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 = 1Zn = 1的所有物种Cu = NA。所以在这个例子中,这将是 (1,4)

我以为我可以尝试使用 R 脚本select * from where,但我似乎无法在 RStudio(R 版本 2.15.1)上安装包 RMySQL。

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% 1,因为前者将返回NA元素 where Niis NACu %in% NA产生与 相同的结果is.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......使用
不是%in%!的使用建议更好,因为结果仍然是一个data.frame,即使一个人只选择一列作为输出,即== 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), ]成语更可取,并且使用子集()通常更好。

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

如果列NiZn和仅Cu包含1and NA,您可以简单地使用:

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