我一直试图找出如何根据某些标准指定值。
我有一个简单的数据集:
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语句,因为它会覆盖其他条件。有什么建议吗?
答案 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;意味着如果条件不满足,那么无论如何都会存在。