Преобразование цикла for для tibble с использованием map в R (tidyverse) - PullRequest
0 голосов
/ 29 сентября 2018

У меня есть 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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...