Заполнить новые столбцы на основе ключевых слов существующего столбца - PullRequest
0 голосов
/ 13 февраля 2020

У меня есть нижеприведенный кадр данных, и я хотел бы создать новые столбцы на основе ключевых слов в каждой строке столбца INFO.

ID<-c(1,2,3,4)
INFO<-c("You used works apps for 4 minutes today.","You checked your phone 10 times today.",
        "Your commute time to work today was 4 minutes.","You (or at least your phone) were at your work place for 15 minutes today"
        )
DATASET<-data.frame(ID,INFO)

Более конкретно, я должен проверить каждую строку INFO для слов apps,phone,commute,or. Затем будет создан один новый столбец для каждого, и он будет иметь либо NA, либо номер, который существует в этой строке, поэтому мой новый набор данных будет выглядеть так:

DATASET2
  ID                                                                      INFO apps phone commute or
1  1                                  You used works apps for 4 minutes today.    4    NA      NA    NA
2  2                                    You checked your phone 10 times today.   NA    10      NA    NA
3  3                            Your commute time to work today was 4 minutes.   NA    NA       4    NA
4  4 You (or at least your phone) were at your work place for 15 minutes today   NA    NA      NA    15

Ответы [ 3 ]

3 голосов
/ 13 февраля 2020

Одно решение с участием purrr, stringr и dplyr может быть:

bind_cols(DATASET, 
          map_dfc(.x = c("apps", "phone", "commute", "place"),
                  ~ DATASET %>%
                   mutate(!!.x := ifelse(str_detect(INFO, .x), 
                                         str_extract_all(INFO, "\\d+"), 
                                         NA_character_)) %>%
                   select(.x)))

  ID                                                                      INFO apps phone commute place
1  1                                  You used works apps for 4 minutes today.    4  <NA>    <NA>  <NA>
2  2                                    You checked your phone 10 times today. <NA>    10    <NA>  <NA>
3  3                            Your commute time to work today was 4 minutes. <NA>  <NA>       4  <NA>
4  4 You (or at least your phone) were at your work place for 15 minutes today <NA>    15    <NA>    15

Если в строке может быть более одного числа:

bind_cols(DATASET, 
          map_dfc(.x = c("apps", "phone", "commute", "place"),
                  ~ DATASET %>%
                   mutate(!!.x := map_chr(ifelse(str_detect(INFO, .x), 
                                                 str_extract_all(INFO, "\\d+"), 
                                                 NA_character_), 
                                          toString)) %>%
                   select(.x)))
2 голосов
/ 13 февраля 2020

Вот еще один вариант:

library(tidyverse)

DATASET %>%
  mutate(INFO = as.character(INFO),
         name =  str_extract_all(INFO, "apps|phone|commute|place"),
         number = parse_number(INFO)) %>%
  unnest_longer(col = name) %>%
  pivot_wider(names_from = "name", values_from = "number")
#> # A tibble: 4 x 6
#>      ID INFO                                            apps phone commute place
#>   <dbl> <chr>                                          <dbl> <dbl>   <dbl> <dbl>
#> 1     1 You used works apps for 4 minutes today.           4    NA      NA    NA
#> 2     2 You checked your phone 10 times today.            NA    10      NA    NA
#> 3     3 Your commute time to work today was 4 minutes.    NA    NA       4    NA
#> 4     4 You (or at least your phone) were at your wor…    NA    15      NA    15
1 голос
/ 13 февраля 2020

здесь есть опция с base R

v1 <- as.numeric(gsub("\\D+",  "", DATASET$INFO))
words <-  c("apps", "phone", "commute", "place")
cbind(DATASET, sapply(words, function(x) {
     i1 <- grepl(x, DATASET$INFO)
     NA^(!(i1 & !duplicated(i1)))}) * v1)
#ID                                                                      INFO apps phone commute place
#1  1                                  You used works apps for 4 minutes today.    4    NA      NA    NA
#2  2                                    You checked your phone 10 times today.   NA    10      NA    NA
#3  3                            Your commute time to work today was 4 minutes.   NA    NA       4    NA
#4  4 You (or at least your phone) were at your work place for 15 minutes today   NA    NA      NA    15
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...