【问题标题】:assign column value based on multiple conditional criteria根据多个条件条件分配列值
【发布时间】:2018-04-30 17:21:18
【问题描述】:

我一直在试图弄清楚如何根据某些标准分配值。

我有一个看起来很简单的数据集:

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 语句,因为它会覆盖那些其他条件。有什么建议吗?

【问题讨论】:

    标签: r if-statement conditional subset


    【解决方案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 作为“else”意味着如果不满足条件,则将保留在那里。

    Demo

    【讨论】:

    • 非常感谢!这很完美。感谢您对 ifelse 的帮助,这让我发疯了,因为我认为它总是会覆盖哈哈
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-23
    • 2023-01-11
    • 1970-01-01
    相关资源
    最近更新 更多