Отдельный столбец с условием if - PullRequest
1 голос
/ 07 августа 2020

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

ID       Value
A      2020-05-09 15:21:28 - Getting response from user
B      2020-07-28 10:07:01 - Trying to load data
C      2020-07-28 10:31:47 - Received message: (Main:'{"Id": "2313124"})
D      2020-07-28 14:46:09 - HV000234: Message as Valid

Я хочу разделить значение столбца на три столбца: timestamp, message, message_text. Желаемый результат:

ID      timestamp            message               message_text
A      2020-05-09 15:21:28    NA              Getting response from user
B      2020-07-28 10:07:01    NA              Trying to load data
C      2020-07-28 10:31:47 Received message   (Main:'{"Id": "2313124"})
D      2020-07-28 14:46:09  HV000234          Message as Valid

Как вы видите, для некоторых строк сообщение отсутствует, но есть текст сообщения, поэтому в этих случаях сообщение должно быть NA. Я пробую это, но это не срабатывает:

log_df_sep <- log_df %>% 
  separate(body, c("timestamp", "Value"), "\\d - ", extra = "merge") %>% 
  separate(Value, c("message", "Value"), "(?: (.*?):)?", extra = "merge")

Но я отлично справляюсь. Что мне делать?

Ответы [ 2 ]

0 голосов
/ 08 августа 2020

Вы можете попробовать это, это длинный код, но я пытаюсь получить результат другим способом, кроме решения выше.

library(tidyverse)
library(stringr)
df2 <- df %>% 
  mutate(time_stamp = str_extract_all(Value, regex("(^.*\\d{2}:\\d{2}:\\d{2})", perl =TRUE)),
         message = str_extract_all(Value, regex("(?<=- ).*", perl =TRUE)),
         message_text = str_replace_all(message, regex("(Received message: |\\w{2}\\d{6}: )", perl = TRUE), ""),
         message = str_extract_all(message, regex("(Received message|\\w{2}\\d{6})"))) %>% 
  select(-Value)
df2[df2=="character(0)"] <- "NA"


# ID          time_stamp          message               message_text
# 1  A 2020-05-09 15:21:28               NA Getting response from user
# 2  B 2020-07-28 10:07:01               NA        Trying to load data
# 3  C 2020-07-28 10:31:47 Received message  (Main:'{'Id': '2313124'})
# 4  D 2020-07-28 14:46:09         HV000234           Message as Valid
0 голосов
/ 07 августа 2020

Попробуйте следующее:

data %>% 
  rowwise() %>% 
  mutate(
   Answer=list(
            str_match(
              Value, 
              paste0("(", tsPattern,") - ([Received message|HV000234]*):*(.*)")
            )
          )
  ) %>% 
  unnest_wider(Answer) %>% 
  rename(timestamp=...2, message=...6, message_text=...7) %>% 
  select(-starts_with("..."), -Value) %>% 
  mutate(message=ifelse(nchar(message)== 0, NA, message))
# A tibble: 4 x 4
  ID    timestamp           message          message_text                     
  <chr> <chr>               <chr>            <chr>                            
1 A     2020-05-09 15:21:28 NA               "Getting response from user"     
2 B     2020-07-28 10:07:01 NA               "Trying to load data"            
3 C     2020-07-28 10:31:47 Received message " (Main:'{\"Id\": \"2313124\"}')"
4 D     2020-07-28 14:46:09 HV000234         " Message as Valid"

Очевидно, что с регулярным выражением потребуется больше доработки, если существует больше вариантов поля message.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...