晚安! 我是巴西人,英语说得不太好。 我的数据库工作量超过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"))
非常感谢您的关注。
答案 0 :(得分:2)
如果您只想在CRIME2
中拥有值,其中CRIME == "ART.14CP"
为每个组(dplyr
和PROCESS
使用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")