【问题标题】:dplyr package - mutatedplyr 包 - 变异
【发布时间】:2020-01-16 20:17:54
【问题描述】:

晚安! 我是巴西人,英语说得不太好。 我使用的数据库超过 10000 行,如下例所示。

df <- data.frame(
    PROCESS = c(180022121, 180022121, 180022105, 180022105, 180022097, 180022097, 180022097, 180022501, 180022501), 
    NAME = c("A_NONIMATO", "B_NONIMATO", "C_NONIMATO", "C_NONIMATO", "D_NONIMATO", "E_NONIMATO", "F_NONIMATO", "G_NONIMATO", "G_NONIMATO"),DATE = c("02/01/2018", "02/01/2018", "01/01/2018", "01/01/2018", "01/01/2018", "01/01/2018", "01/01/2018", "02/01/2018", "02/01/2018"), 
    CRIME = c("ART.33", "ART.33", "ART.35", "ART.33", "ART.155", "ART.155", "ART.155", "ART.157", "ART.14CP"))

假设:

a) 相同的PROCESS,不同的PARTNAME,相同的CRIME(第 1 行和第 2 行)

b) 相同的PROCESS,相同的PARTNAME,不同的CRIME(第 3 行和第 4 行)

c) 相同的PROCESS,相同的PARTNAME,不同的CRIME(第 8 行和第 9 行)

我的问题涉及假设 c:我需要创建一个列 CRIME2 来转移 ART.14CP 将案例变成一行……而不是转到假设 b。在整个数据库中将始终写入ART.14CP

看起来像这样:

df2 <- data.frame(
    PROCESS = c(180022121, 180022121, 180022105, 180022105, 180022097, 180022097, 180022097, 180022501),
    NAME = c("A_NONIMATO", "B_NONIMATO", "C_NONIMATO", "C_NONIMATO", "D_NONIMATO", "E_NONIMATO", "F_NONIMATO", "G_NONIMATO"),
    DATE = c("02/01/2018", "02/01/2018", "01/01/2018", "01/01/2018", "01/01/2018", "01/01/2018", "01/01/2018", "02/01/2018"),
    CRIME = c("ART.33", "ART.33", "ART.35", "ART.33", "ART.155", "ART.155", "ART.155", "ART.157"),
    CRIME2 = c("", "", "", "", "", "", "", "ART.14CP"))

非常感谢您的关注。

【问题讨论】:

  • 请编辑您的标题以更能描述您的问题;还要避免诸如“帮帮我”、“如果可以的话帮帮我”等语句。

标签: r dplyr


【解决方案1】:

如果您只想在CRIME2 中拥有值,其中CRIME == "ART.14CP" 一种方式使用dplyr 为每个组(PROCESSNAME)分配值"ART.14CP",仅当它存在或分配一个空值。我们使用filter 删除"ART.14CP" 的重复行条目。

library(dplyr)

df %>%
  group_by(PROCESS, NAME) %>%
  mutate(CRIME2 = if (any(CRIME == "ART.14CP")) "ART.14CP" else "") %>%
  filter(CRIME != "ART.14CP")


#    PROCESS NAME       DATE       CRIME   CRIME1  
#      <dbl> <fct>      <fct>      <fct>   <chr>   
#1 180022121 A_NONIMATO 02/01/2018 ART.33  ""      
#2 180022121 B_NONIMATO 02/01/2018 ART.33  ""      
#3 180022105 C_NONIMATO 01/01/2018 ART.35  ""      
#4 180022105 C_NONIMATO 01/01/2018 ART.33  ""      
#5 180022097 D_NONIMATO 01/01/2018 ART.155 ""      
#6 180022097 E_NONIMATO 01/01/2018 ART.155 ""      
#7 180022097 F_NONIMATO 01/01/2018 ART.155 ""      
#8 180022501 G_NONIMATO 02/01/2018 ART.157 ART.14CP

【讨论】:

    【解决方案2】:

    这里使用 case_when 和另一种接近逻辑的方式对 Ronak 的答案进行了轻微修改。我更喜欢 case_when 到 if 或 ifelse 因为它对阅读您的代码的其他人来说更直观,特别是如果您需要使用多个条件或有多个案例。 TRUE 条件将捕获任何剩余的情况;如果你不说,这些情况默认设置为NA。

    library(dplyr)
    df %>% 
      group_by(PROCESS, NAME) %>%
      mutate(CRIME2 = case_when(
        "ART.14CP" %in% CRIME ~ "ART.14CP",
        TRUE ~ ""
      )) %>% 
      filter(CRIME != "ART.14CP")
    

    【讨论】:

      猜你喜欢
      • 2014-08-19
      • 1970-01-01
      • 1970-01-01
      • 2017-06-02
      • 2018-11-30
      • 2018-07-12
      • 1970-01-01
      • 2017-05-17
      • 1970-01-01
      相关资源
      最近更新 更多