根据多个条件条件分配列值

assign column value based on multiple conditional criteria

我一直在努力弄清楚如何根据某些标准分配一个值。

我有一个简单的数据集:

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)

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

我尝试了几种不同的方法,但总是卡住。当我执行 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 语句,因为它会覆盖其他条件。有什么建议吗?

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

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作为"else"意味着如果条件不满足,任何东西都会留在那。

Demo