Есть ли способ поместить подкадр данных в логический и сохранить исходную структуру данных в R? - PullRequest
0 голосов
/ 04 мая 2020

Я разбирал неструктурированный текст и разделил фразы на отдельные поля, в первую очередь для удобства чтения. Результирующий фрейм данных выглядит примерно так (то есть содержит NA):

behaviour <- data.frame(field_1 = c("cat eats meal", "cat watches fish", "cat watches frog", NA),
                        field_2 = c("bird flies away", "cat watches bird", "cat watches fish", NA),
                        field_3 = c("cat is bored", NA, NA, "cat watches sky"))

Теперь я заинтересован в извлечении всех значений, которые содержат слово «watches», при сохранении структуры набора данных.

watches <- behaviour %>%
  map_df(~ str_detect(., "watches"))

Два набора данных выглядят следующим образом:

behaviour

behaviour

watches

watches

Я хотел бы получить новый фрейм данных, в котором значения в behaviour сохраняются, только если соответствующие значения в watches равны TRUE, а структура исходного фрейма данных сохраняется , Я попытался преобразовать как матрицу, так и подмножество через behaviour[watches], но на выходе был символьный вектор, который не имел сохраненной структуры.

enter image description here

Мне интересно, если это как-то связано с mutate_all на behaviour, то есть если watches == T, то вставьте или сохраните оригинал значение в behaviour?

Заранее спасибо!

1 Ответ

1 голос
/ 04 мая 2020

Поскольку у вас уже есть watches, вы можете напрямую назначить NA:

behaviour[!watches] <- NA

Без создания watches мы можем использовать mutate_all как:

library(dplyr)
behaviour %>% mutate_all(~replace(., !stringr::str_detect(., "watches"), NA))

#           field_1          field_2         field_3
#1             <NA>             <NA>            <NA>
#2 cat watches fish cat watches bird            <NA>
#3 cat watches frog cat watches fish            <NA>
#4             <NA>             <NA> cat watches sky

В базе R мы можем использовать lapply с grepl

behaviour[] <- lapply(behaviour, function(x) replace(x, !grepl('watches', x), NA))
#or with grep
#behaviour[] <- lapply(behaviour, function(x) replace(x, -grep('watches', x), NA))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...