在第 1 列中所需变量的相邻单元格(第 2 列)中添加值

Adding values in adjacent cells (of column 2) for desired variables in column 1

提问人:Crippycajes 提问时间:7/6/2023 最后编辑:PhilCrippycajes 更新时间:7/8/2023 访问量:35

问:

在我的 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

感谢您的帮助!

R DataFrame 操作 数据整理

评论

0赞 Dan Adams 7/6/2023
你试过吗?dplyr::case_when()
0赞 Chamkrai 7/6/2023
先解决你之前的问题?
0赞 Community 7/13/2023
请提供足够的代码,以便其他人可以更好地理解或重现问题。

答:

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