У меня есть data_frame (с именем chat
), экспортированный из Whatsapp-Chat.Чтобы очистить это, я должен проверить, имеет ли каждая строка в первом столбце определенный формат (соответствует строке регулярного выражения "^(\\d\\d\\.\\d\\d\\.\\d\\d,)"
), и, если это не так, мне нужно переместить всю строку.В Интернете я нашел решение, которое выглядит следующим образом:
for(row in c(1:nrow(chat))[-grep("^(\\d\\d\\.\\d\\d\\.\\d\\d,)", chat[[1]])]){
end <- which(is.na(chat[row,]))[1]
chat[row, 5:(4+end)]<- chat[row, 1:(end-1)]
chat[row, 1:4] <- NA
}
Итак, что делает эта функция, она перебирает все строки, которые не соответствуют условию "^(\\d\\d\\.\\d\\d\\.\\d\\d,)"
в столбце [[1]]
объекта chat
, определяет первый пустой столбец, конец затем сдвигает всю строку на пять столбцов «влево».
Хотя это, безусловно, работает, мне интересно написать эту функцию с использованием функции map
в purrr
.Тем не менее, я все еще борюсь с их пониманием;однако наиболее важными вопросами здесь будут:
Как перебрать только некоторые элементы вектора, используя purrr
?map_at
и map_if
пришли мне в голову, но я не мог их понять.
Затем, выделив только те строки, которые я хочу изменить, какЗатем я применяю функцию ко всей строке?
Я благодарен за любые хорошие и подробные уроки для мурлыканья, но, конечно же, и за ответ.
Для тиражирования MWE:
# creating an MWE tibble; the second line is empty, while the third line doesn't begin with a date:
chat <- tibble(
X1=c("24.05.16,", NA, "word", "24.05.16,", "24.05.16,", "24.05.16,"),
X2=c("09:04", NA, "word","12:48,14:13","16:16", "word"),
X3=c("word",NA, "word", "word","word","word" ),
X4=c("word",NA, "word", "word","word","word" )
)
# adding five columns to the end of the tibble
chat <- cbind(chat, matrix(nrow = nrow(chat), ncol = 5))
# applying the loop:
for(row in c(1:nrow(chat))[-grep("^(\\d\\d\\.\\d\\d\\.\\d\\d,)", chat[[1]])]){
end <- which(is.na(chat[row,]))[1]
chat[row, 5:(4+end)] <- chat[row, 1:(end-1)]
chat[row, 1:4] <- NA
}