【问题标题】:Mutate IF-Else Statement using max value使用最大值改变 IF-Else 语句
【发布时间】:2021-01-15 17:54:53
【问题描述】:

我知道这应该很容易解决,但由于某种原因,我没有得到我正在寻找的正确输出。我有一个大型数据集,我试图根据两个条件创建一个新列,如果计数列标记为 1 并且该行具有最大付款,然后创建一个标记为 1 的新列并标记其他列为0。我创建了一个小例子:

ex <- data.frame(EOC = c(1,1,2,2,2),EOC_cnt = c(1,1,1,0,0), pay = c(500,0,200,12,34))

我想要的是:

ex <- data.frame(EOC = c(1,1,2,2,2),EOC_cnt = c(1,1,1,0,0), pay = c(500,0,200,12,34)),EOC_cnt1 = c(1,0,1,0,0)

我有:

out <- ex %>% group_by(EOC) %>% mutate(EOC_cnt1 = ifelse(EOC_cnt ==1 & pmax(pay) , "1", "0"))

这适用于这个较小的示例,但是当我将其应用于较大的数据集时,每个 EOC 组仍然没有得到一个 1。还有其他方法可以获得我想要的结果吗?

(我的 EOC_cnt 列中基本上有重复项,并且想创建一个新列,其中每个 EOC 只有一个 1)

这是一个答案全为 0 的示例:

dput(ex2)
structure(list(pay = c(342.39, 48.27, 299.96, 274.12, 342.39, 
121.36), EOC = c(1, 1, 1, 1, 1, 1), EOC_cnt = c(0, 1, 0, 0, 0, 
0)), row.names = c(NA, -6L), class = c("data.table", "data.frame"
), .internal.selfref = <pointer: 0x000001cdf95a1ef0>)

【问题讨论】:

    标签: r if-statement max tidyverse dplyr


    【解决方案1】:

    我们不需要ifelse,可以用+或as.integer强制转换成二进制

    ex %>% 
        group_by(EOC) %>% 
        mutate(EOC_cnt1 = +(pay == max(pay) & EOC_cnt == 1))
    

    如果有重复,那么我们使用match 来查找两者都为真的第一个位置

    ex %>%
       group_by(EOC) %>%
       mutate(EOC_cnt1 =  +(row_number() %in% which(pay == max(pay) & EOC_cnt == 1)[1]))
    

    基于新数据'ex2',我们是否需要仅在'EOC_cnt'为1的元素中检查'pay'的max。在这种情况下,子集'pay' based在 'EOC_cnt' 1 值上,取 max 并进行比较

    ex2 %>% 
     group_by(EOC) %>% 
     mutate(EOC_cnt2 = +(pay == max(pay[EOC_cnt == 1]) & EOC_cnt == 1))
    

    【讨论】:

    • 我的原始数据集中有某些实例,它将为 EOC 组返回全 0。我在我的问题中包含了一个示例
    • @vizidea 在新示例中,当 EOC_cnt 为 1 时,工资不是最大值。您的预期输出是多少
    • @vizidea 我只是想知道,你是否想要ex2 %&gt;% group_by(EOC) %&gt;% mutate(EOC_cnt2 = +(pay == max(pay[EOC_cnt == 1]) &amp; EOC_cnt == 1))
    猜你喜欢
    • 1970-01-01
    • 2021-09-14
    • 2019-04-09
    • 1970-01-01
    • 2020-11-23
    • 1970-01-01
    • 2023-02-11
    • 2017-02-05
    • 1970-01-01
    相关资源
    最近更新 更多