根据多个条件标准指定列值

时间:2017-11-17 01:46:14

标签: r if-statement conditional subset

我一直试图找出如何根据某些标准指定值。

我有一个简单的数据集:

fish <- data.frame ("method"=c("cryptic", "cryptic", "cryptic", 
                               "quad", "quad", "quad", 
                               "fish", 
                               "1mquad", "1mquad"),
                    "species"= c("A", "B", "C", 
                                 "A", "B", "D", 
                                 "A",
                                 "A", "B"), 
                  "cut"=1)

我想将cut的值更改为0,如果一个物种同时具有隐秘和四元或神秘的方法和1mquad。

我尝试了一些不同的东西,并一直陷入困境。当我做一个if语句时,我会收到奇怪的警告。我尝试过的一些事情就是制作一个只有神秘的子集df

cryptic <- fish [fish$method == "cryptic",]

然后尝试子集

fish$cut [match(fish$species, cryptic$species) & fish$method =="quad"] <- 0
fish$cut [match(fish$species, cryptic$species) & fish$method =="1mquad"] <- 0

但这不起作用。我也试过创造条件:

cond3 <- fish$species %in% intersect(fish$species, cryptic$species)
cond4 <- fish$method %in% c ("1mquad", "quad", "cryptic")

用if做声明,但无济于事。此外,在更改为0之前,我还有一些其他条件,因此我无法使用ifelse语句,因为它会覆盖其他条件。有什么建议吗?

1 个答案:

答案 0 :(得分:1)

你对条件非常接近。这是一个经过调整的方式:

crypt = unique(fish$species[fish$method == "cryptic"])
quad = unique(fish$species[fish$method %in% c("quad", "1mquad")])
to_change = intersect(crypt, quad)
fish$cut = ifelse(fish$species %in% to_change, 0, fish$cut)
fish
#    method species cut
# 1 cryptic       A   0
# 2 cryptic       B   0
# 3 cryptic       C   1
# 4    quad       A   0
# 5    quad       B   0
# 6    quad       D   1
# 7    fish       A   0
# 8  1mquad       A   0
# 9  1mquad       B   0

ifelse语句与fish$cut一起使用作为&#34;否则&#34;意味着如果条件不满足,那么无论如何都会存在。

Demo