Существует ли функция R для удаления строк, которые НЕ начинаются с отметки времени? - PullRequest
0 голосов
/ 06 апреля 2019

Я пытаюсь ознакомиться с R, удалив некоторые данные из чата WhatsApp между мной и другом.Пока что я преобразовал .txt в .csv, но у меня есть проблема.

Я бы хотел, чтобы моя строка была отформатирована так:

,,

Когда чат слишком длинный, он начинается с новой строки (строки).Итак, я получаю строку вроде:

Как очистить файл, чтобы все мои строки начинались с отметки времени?

Я пытался работатьс регулярными выражениями.Я следовал учебному пособию https://journocode.com/2016/01/31/project-visualizing-whatsapp-chat-logs-part-1-cleaning-data/, но результаты оказались не такими, как я ожидал

# Add 5 empty rows to end to make space for shift
chat <- cbind(chat, matrix(nrow = nrow(chat), ncol = 5))

cat("Rows without time stamp:", length(grep("^\\D", chat[,1])),
    "(", grep("^\\D", chat[,1]), ")", "\n")
for(row in grep("^\\D", chat[,1])){
  end <- which(is.na(chat[row,]))[1] #first column without text in it
  chat[row, 6:(5+end)] <- chat[row, 1:(end-1)]
  chat[row, 1:(end-1)] <- NA
}
chat <- chat[-which(apply(chat, 1, function(x) all(is.na(x))) == TRUE),]

Я получил очень грязный CSV-файл.отметки времени повсюду, общение повсюду.Def не тот результат, который я имел в виду

1 Ответ

0 голосов
/ 10 апреля 2019

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

chat_raw <- scan(text = "
12/07/2017, 22:35 - Messages to this group are now secured with end-to-end encryption. Tap for more info.
12/07/2017, 22:35 - You created group 'Tes'
12/07/2017, 22:35 - Johannes Gruber: <Media omitted>
12/07/2017, 22:35 - Johannes Gruber: Fruit bread with cheddar <U+263A><U+0001F44C><U+0001F3FB>
13/07/2017, 09:12 - Test: It's fun doing text analysis with R
isn't it?
13/07/2017, 09:16 - Johannes Gruber: Haha it sure is <U+0001F605>
28/09/2018, 13:27 - Johannes Gruber: Did you know there is an incredible number of emojis in WhatsApp? Check it out:
", what = character(), sep = "\n")

Это оставляет нам объект, который похож на то, что мы получили бы, используя readLines(): каждая строка текста является одним элементом символьного вектора.Теперь мы можем извлечь метки времени с помощью регулярных выражений:

time <- stringi::stri_extract_first_regex(
  str = chat_raw,
  pattern = "^\\d{2}/\\d{2}/\\d{4}, \\d{2}:\\d{2}"
)

\\d{2} - это число с двумя символами, \ d {4} число с четырьмя символами.Вам нужно будет изменить символы между цифрами, чтобы получить правильный формат даты.Я использую stringi здесь для скорости, но многие люди находят stringr более удобным, и функции работают почти так же.Теперь вектор time выглядит следующим образом:

time
#> [1] "12/07/2017, 22:35" "12/07/2017, 22:35" "12/07/2017, 22:35"
#> [4] "12/07/2017, 22:35" "13/07/2017, 09:12" NA                 
#> [7] "13/07/2017, 09:16" "28/09/2018, 13:27"

Мы взяли время из каждой строки, кроме той, у которой нет метки времени.Мы можем циклически пройти по всем строкам без отметки времени и добавить туда символы до строки:

for (l in which(is.na(time))) {
  chat_raw[l - 1] <- stringi::stri_paste(chat_raw[l - 1], chat_raw[l],
                                         sep = " ")
}

which(is.na(time)) в этом случае вернет только 6, поскольку это единственная строка, где время равно NA.Таким образом, вы можете прочитать chat_raw[l - 1] как chat_raw[5], то есть пятую строку chat_raw.stringi::stri_paste совпадает с paste(), следовательно, строка 6 добавляется в строку 5. Вы можете выбрать другой разделитель, если хотите.Я выбираю "\n", чтобы отметить новую строку в моем пакете.Теперь у векторов chat_raw и time есть этот дополнительный элемент, который сейчас нам бесполезен.Мы можем удалить это с помощью:

chat_raw <- chat_raw[!is.na(time)]
time <- time[!is.na(time)]

Чтобы получить это в хорошем формате, давайте сделаем из него data.frame:

tibble::tibble(
  time = time,
  text = chat_raw
)
#> # A tibble: 7 x 2
#>   time            text                                                     
#>   <chr>           <chr>                                                    
#> 1 12/07/2017, 22~ 12/07/2017, 22:35 - Messages to this group are now secur~
#> 2 12/07/2017, 22~ 12/07/2017, 22:35 - You created group 'Tes'              
#> 3 12/07/2017, 22~ 12/07/2017, 22:35 - Johannes Gruber: <Media omitted>     
#> 4 12/07/2017, 22~ 12/07/2017, 22:35 - Johannes Gruber: Fruit bread with ch~
#> 5 13/07/2017, 09~ 13/07/2017, 09:12 - Test: It's fun doing text analysis w~
#> 6 13/07/2017, 09~ 13/07/2017, 09:16 - Johannes Gruber: Haha it sure is <U+~
#> 7 28/09/2018, 13~ 28/09/2018, 13:27 - Johannes Gruber: Did you know there ~

Вот, пожалуйста, хороший и чистый вывод:)

Если вы хотите больше работать с данными WhatsApp, ознакомьтесь с демонстрацией моего пакета .Я не размещал его на CRAN, так как считаю, что вклад пока немного, но если вы можете придумать классные функции, я могу добавить их, и, возможно, со временем это станет законным пакетом.

...