Добавить строку (dplyr) - PullRequest
       0

Добавить строку (dplyr)

1 голос
/ 27 февраля 2020

У меня есть такой фрейм данных:

df <- 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"))

Мне нужно, чтобы он выглядел так:

df1 <- 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"))

спасибо

Ответы [ 4 ]

3 голосов
/ 27 февраля 2020

Мы можем использовать pivot_longer, чтобы преобразовать столбцы 'CRIME' в 'длинный' формат, удалить строки с пустыми значениями с помощью filter

library(dplyr)
library(tidyr)
df %>% 
   pivot_longer(cols = starts_with("CRIME"), values_to = "CRIME") %>%
   select(-name) %>%
   filter(CRIME != "") 
1 голос
/ 27 февраля 2020

Вот еще одно решение, использующее data.table:

library(data.table)
setDT(df)
rbind(df[, !"CRIME2"], df[.N, !"CRIME"], use.names = FALSE)

# PROCESS       NAME       DATE    CRIME
# 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
# 9 180022501 G_NONIMATO 02/01/2018 ART.14CP
0 голосов
/ 27 февраля 2020

Вот еще одно решение, использующее tidyverse, которое использует na_if для преобразования "" в NA, а затем отбрасывает эти записи, используя values_drop_na = T внутри pivot_longer.

library(tidyverse)

df %>%
  #Transform "" entries into NA
  na_if("") %>%
  #Pivot longer with values_drop_na = T
  pivot_longer(cols = c(CRIME, CRIME2), 
               names_to = "numCrime",
               values_to = "CRIME",
               values_drop_na = T) %>%
  select(-numCrime)
0 голосов
/ 27 февраля 2020

A data.table альтернатива:

library(data.table)

setDT(df)
melt(df, measure.vars = grep('^CRIME', names(df)), value.name = "CRIME")
     [CRIME != ''][,variable := NULL][]

#     PROCESS       NAME       DATE    CRIME
#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
#9: 180022501 G_NONIMATO 02/01/2018 ART.14CP
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...