提问人:Luther_Proton 提问时间:3/2/2023 更新时间:3/3/2023 访问量:58
R - 根据一列的不同条件创建新列
R - Create new columns based on different conditions of one column
问:
寻求一些专业知识/指导,根据一列的不同条件在数据框中创建新列。
我的数据帧非常大,但为了便于参考,我已将其子集化。这是动物爱好者对其成本的反馈。
反馈 | 成本 | 猪 |
---|---|---|
猫, 狗, 兔子 | 90 | 100 |
猫和兔子 | 60 | 100 |
猫和鱼 | 50 | 100 |
狗/猪/兔 | 250 | 100 |
猫、猪 | 200 | 100 |
鱼, 兔子, 狗 | 150 | 100 |
狗、猫和猪 | 260 | 100 |
df = structure(list(Feedback = c("cat, dog, rabbit", "cat & rabbit ",
"cat and fish", "dog/pig/rabbit", "cat, pig", "fish, rabbit, dog",
"dog, cat and pig"), Cost = c(90L, 80L, 50L, 300L, 200L, 120L,
260L), pig = c(100L, 100L, 100L, 100L, 100L, 100L, 100L)),
class = "data.frame", row.names = c(NA, -7L))
有谁知道我如何根据 Feedback 列 dplyr 或 tidyverse 函数中的动物创建新列?
目前我正在使用 ifelse(),如果数据帧变大,这是不可行的。
条件是
- 猪的成本固定为100。
- 剩余动物的成本可以平均分配。但是,如果猪存在,我必须从总成本中减去 100,然后再平均分配。
- 需要考虑反馈列中的特殊字符来分隔动物。
理想的输出应如下所示:
反馈 | 成本 | 猪 | 猫 | 狗 | 兔 | 鱼 | pig_new |
---|---|---|---|---|---|---|---|
猫, 狗, 兔子 | 90 | 100 | 30 | 30 | 30 | 0 | 0 |
猫和兔子 | 60 | 100 | 30 | 0 | 30 | 0 | 0 |
猫和鱼 | 50 | 100 | 25 | 0 | 0 | 25 | 0 |
狗/猪/兔 | 250 | 100 | 0 | 75 | 75 | 0 | 100 |
猫、猪 | 200 | 100 | 100 | 100 | 0 | 0 | 0 |
鱼, 兔子, 狗 | 150 | 100 | 0 | 50 | 50 | 50 | 0 |
狗、猫和猪 | 260 | 100 | 80 | 80 | 0 | 0 | 100 |
提前致谢!
答:
0赞
akrun
3/3/2023
#1
根据逻辑,我们可以做到
library(dplyr)# version >= 1.1.0
library(stringr)
library(fastDummies)
dummy_cols(df, "Feedback", split = "\\s*[,&/]\\s*|\\s*and\\s*") %>%
rename_with(~ str_replace(str_remove(.x, "Feedback_"), "pig", "new_pig"),
starts_with("Feedback_")) %>%
mutate(cnt = rowSums(pick(cat:dog)),
across(cat:dog, ~ case_when(.x== 1 & new_pig == 0 ~ Cost/cnt, .x == 1 &
new_pig == 1 ~ (Cost - pig)/cnt, TRUE ~ 0)),
new_pig = pig * new_pig, cnt = NULL)
评论
1赞
Luther_Proton
3/3/2023
这非常有效!从来不知道fastDummies包,感谢分享!
评论