dplyr软件包-变异

时间:2019-09-16 01:08:11

标签: r dplyr

晚安! 我是巴西人,英语说得不太好。 我的数据库工作量超过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"))

非常感谢您的关注。

2 个答案:

答案 0 :(得分:2)

如果您只想在CRIME2中拥有值,其中CRIME == "ART.14CP"为每个组(dplyrPROCESS使用NAME的一种方法,请分配值{{ 1}}(如果存在),否则分配一个空值。我们使用"ART.14CP"删除了"ART.14CP"的重复行条目。

filter

答案 1 :(得分:1)

这里使用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")