R - 根据一列的不同条件创建新列

R - Create new columns based on different conditions of one column

提问人:Luther_Proton 提问时间:3/2/2023 更新时间:3/3/2023 访问量:58

问:

寻求一些专业知识/指导,根据一列的不同条件在数据框中创建新列。

我的数据帧非常大,但为了便于参考,我已将其子集化。这是动物爱好者对其成本的反馈。

反馈 成本
猫, 狗, 兔子 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(),如果数据帧变大,这是不可行的。

条件是

  1. 猪的成本固定为100。
  2. 剩余动物的成本可以平均分配。但是,如果猪存在,我必须从总成本中减去 100,然后再平均分配。
  3. 需要考虑反馈列中的特殊字符来分隔动物。

理想的输出应如下所示:

反馈 成本 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

提前致谢!

R DataFrame dplyr Tidyverse 数据操作

评论


答:

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包,感谢分享!