提问人:Crippycajes 提问时间:7/6/2023 最后编辑:PhilCrippycajes 更新时间:7/8/2023 访问量:35
在第 1 列中所需变量的相邻单元格(第 2 列)中添加值
Adding values in adjacent cells (of column 2) for desired variables in column 1
问:
在我的 data.frame 中,我有一个包含项目列表的列和一个包含每个项目金额的列。每个项目都属于一个组。我想计算所有组中所选项目的金额总和,并根据总和在新列中输入一个值。
这是我的表格:
群 | 项目 | 量 |
---|---|---|
1 | 一个 | 10 |
1 | 在 | 20 |
1 | EP系列 | 5 |
1 | S | 5 |
2 | 交流 | 10 |
2 | 一个 | 5 |
2 | P | 61 |
2 | 某人 | 39 |
3 | Z | 25 |
3 | 交流 | 80 |
3 | P | 80 |
3 | 那 | 0 |
4 | Z | 0 |
4 | M | 100 |
4 | 那 | 0 |
4 | 那 | 0 |
我想应用的语句:
- 如果组包含 A、AT、EP、AC 中的任何一个,则执行计算
- 如果 A+AT+EP+AC >= 80,则在新的“SUM”列中为组中的所有值输入“红色”
- 如果 A+AT+EP+AC <= 20,则在组中所有值的新“SUM”列中输入“黄色”
- 如果 20< A+AT+EP+AC >80 则在组中所有值的新“SUM”列中输入“橙色”
- 如果组不包含任何 A、AT、EP、AC,则输入“黑色”
我尝试将 mutate 与合并到 SUM 中的多个 SUM 一起使用,但我不知道如何应用计算。
这就是我想要的:
群 | 项目 | 量 | 和 |
---|---|---|---|
1 | 一个 | 10 | 橙 |
1 | 在 | 20 | 橙 |
1 | EP系列 | 5 | 橙 |
1 | S | 5 | 橙 |
2 | 交流 | 10 | 黄色 |
2 | 一个 | 5 | 黄色 |
2 | P | 61 | 黄色 |
2 | 某人 | 39 | 黄色 |
3 | Z | 25 | 红 |
3 | 交流 | 80 | 红 |
3 | P | 80 | 红 |
3 | 那 | 0 | 红 |
4 | Z | 0 | 黑 |
4 | M | 100 | 黑 |
4 | 那 | 0 | 黑 |
4 | 那 | 0 | 黑 |
感谢您的帮助!
答:
0赞
Laura
7/8/2023
#1
我相信有一种更有效的方法可以做到这一点,但你可以试一试 - 如果示例数据不包含来自 ITEM 的所有可能值,您可能需要调整正则表达式。我把你的>翻转到了橙色,因为你所拥有的没有多大意义,并且翻转使输出与你所拥有的预期输出相匹配。
df = data.frame(GROUP = c(1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4),
ITEM = c("A", "AT", "EP", "S", "AC", "A", "P", "SB", "Z", "AC", "P", NA, "Z", "M", NA, NA),
AMOUNT = c(10, 20, 5, 5, 10, 5, 61, 39, 25, 80, 80, 0, 0, 100, 0, 0))
df1 <- df %>% group_by(GROUP) %>% mutate(in_group = paste(ITEM, collapse = " ")) %>%
mutate(SUM = ifelse(grepl("^A| A|AT|EP|AC", in_group), "TBD", "black")) %>%
mutate(amount_placeholder = ifelse(grepl("^A$|^AT$|^EP$|^AC$", ITEM), AMOUNT, 0)) %>%
group_by(GROUP) %>% summarize(total = sum(amount_placeholder), SUM = first(SUM)) %>%
mutate(SUM = ifelse(SUM == "black", SUM, ifelse(total >= 80, "red", ifelse(total <= 20, "yellow", ifelse(total > 20 & total < 80, "orange", NA))))) %>% right_join(df, by = "GROUP") %>%
select(GROUP, ITEM, AMOUNT, SUM)
将来,一个可重现的例子使帮助你变得更加容易——你可以使用我上面使用的函数或data.frame()
dput
评论
dplyr::case_when()