Я недавно написал пакет, чтобы позаботиться о данных 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, так как считаю, что вклад пока немного, но если вы можете придумать классные функции, я могу добавить их, и, возможно, со временем это станет законным пакетом.