首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用max值更改IF-max语句

使用max值更改IF-max语句
EN

Stack Overflow用户
提问于 2021-01-15 17:54:53
回答 1查看 402关注 0票数 2

我知道这应该很容易修复,但由于某些原因,我没有得到正确的输出,我正在寻找。我有一个大型数据集,其中我试图创建一个基于两个条件的新列--如果一个count列被标记为1,如果该行有最大的支付额,那么创建一个新的列,其中标记为1,并将其他列标记为0。我创建了一个小示例:

代码语言:javascript
复制
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))

我想要的是:

代码语言:javascript
复制
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)

我有:

代码语言:javascript
复制
out <- ex %>% group_by(EOC) %>% mutate(EOC_cnt1 = ifelse(EOC_cnt ==1 & pmax(pay) , "1", "0"))

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

(实际上,我的EOC_cnt列中有副本,并且希望创建一个新列,其中每个EOC只有一个)

下面是答案创建所有0的例子:

代码语言:javascript
复制
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>)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-15 17:56:08

我们不需要ifelse,它可以强制使用+as.integer的二进制

代码语言:javascript
复制
ex %>% 
    group_by(EOC) %>% 
    mutate(EOC_cnt1 = +(pay == max(pay) & EOC_cnt == 1))

如果存在重复项,则使用match查找第一个位置,其中两者均为真。

代码语言:javascript
复制
ex %>%
   group_by(EOC) %>%
   mutate(EOC_cnt1 =  +(row_number() %in% which(pay == max(pay) & EOC_cnt == 1)[1]))

根据新的数据“EX2”,尚不清楚是否只需要在“max”为1的元素中检查“EOC_cnt”的“支付”。

代码语言:javascript
复制
ex2 %>% 
 group_by(EOC) %>% 
 mutate(EOC_cnt2 = +(pay == max(pay[EOC_cnt == 1]) & EOC_cnt == 1))
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65741186

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档