r - 使用最大值改变 IF-Else 语句

标签 r if-statement max tidyverse dplyr

我知道这应该很容易修复,但由于某种原因,我没有得到我正在搜索的正确输出。我有一个大型数据集,我尝试根据两个条件创建一个新列,如果计数列标记为 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>)

最佳答案

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

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

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

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

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

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

关于r - 使用最大值改变 IF-Else 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65741186/

相关文章:

r - 检查为 CRAN,但不要跳过任何测试

php - PHP 中的冒号运算符

C++ 增加 int 大小限制

r - 根据类别分析多项选择题和多项选择答案

r - 数据框中所有列的唯一值计数

c++ - 在 if 参数中调用 bool 函数

java - 制作密码 key validator ,其中一个输出应显示 : Reports ALL The Rules That The Key Failed

c++ - 在 OpenCV 中查找 SparseMat 的最大和最小位置

mysql - 如何使用MySQL选择每天的最后一条记录

r - 在 R 中使用 map() rowise