【问题标题】:Changing cell value based on multiple conditions根据多个条件更改单元格值
【发布时间】:2021-09-11 22:39:17
【问题描述】:

我对 R 很陌生,正在寻找一种有效的方法来根据特定条件更新单元格中的值。我假设这需要一个 for 循环或其他函数。

这是数据集。

project_ID <- c(1, 1, 1, 2, 2, 2, 3, 3, 3)
sector <- c("Energy", "None", "None", "Water", "None", "None", "Solar", "Solar", "None")
percentage_approval  <- c(100, 50, 50, 100, 25, 25, 100, 30, 40)
type <- c("Program", "Sub-Project", "Sub-Project", "Program", "Sub-Project", "Sub-Project", "Program", "Sub-Project", "Sub-Project")
funding <- c(5, 2.5, 2.5, 16, 4, 4, 10, 3, 4)
cofinancing <- c(100000, 750000, 80000, 4000000, 6660000, 11000, 12000, 1111111, 1111999)


df <- data.frame(project_ID, sector, percentage_approval, type, funding, cofinancing)

我想做的事:

按项目 ID 对数据进行分组。

然后,检查子项目的“percentage_approval”之和是否等于100。如果是这样,则应删除具有相同项目ID的“程序”行。

如果子项目的“percentage_approval”之和不等于100,则需要进行以下调整:

  • 从同一项目的项目中减去子项目“资助” 身份证。
  • 根据“子项目”金额调整“联合融资”。因此,例如,项目 ID #2 的计划的联合融资应调整为 677000(即,基于子项目联合融资的剩余 50%(即 666000 + 11000))。同样,对于项目 ID #3,该计划的联合融资应更新为 1285714.29(即,剩余的 30% 基于子项目的联合融资水平)。

最后,我想更新“无”的扇区,以获取每个项目 ID 的扇区值。

因此,这是我想要的决赛桌:

project_ID_2 <- c(1, 1, 2, 2, 2, 3, 3, 3)
sector_2 <- c("Energy", "Energy", "Water", "Water", "Water", "Solar", "Solar", "None")
percentage_approval_2  <- c(50, 50, 100, 25, 25, 100, 30, 40)
type_2 <- c("Sub-Project", "Sub-Project", "Program", "Sub-Project", "Sub-Project", "Program", "Sub-Project", "Sub-Project")
funding_2 <- c(2.5, 2.5, 8, 4, 4, 3, 3, 4)
cofinancing_2 <- c(750000, 80000, 677000, 666000, 11000, 1285714.29, 1000000, 2000000)

df.fixed <- data.frame(project_ID_2, sector_2, percentage_approval_2, type_2, funding_2, cofinancing_2)

【问题讨论】:

    标签: r for-loop dplyr


    【解决方案1】:

    部分答案:

    这是总和等于 100 的时候。我现在正在尝试理解其余部分。

    # First, doing the sum and getting the projects ID where sum = 100
    df_temp <- df %>% 
      filter(type != "Program") %>% 
      group_by(project_ID) %>% 
      summarise(advance = sum(percentage_approval))
    
    Get100 <- df_temp %>% 
      filter(advance == 100) %>% 
      select(project_ID)
    
    # Remove Program lines for 100 projects
    
    df <- df %>% 
      filter(!(project_ID %in% Get100 & type == "Program"))
    

    【讨论】:

    • 非常感谢!我期待看到其余的答案。
    • 我明天去找。保持联系!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 2013-10-23
    相关资源
    最近更新 更多