Как использовать case_when для списка - PullRequest
0 голосов
/ 11 января 2019

У меня есть следующий список:

   tryout<- list(c("stomach:biopsy", ",colon:biopsy", ",stomach:biopsy"), 
        character(0), character(0), "oesophagus:biopsy", character(0), 
        character(0))

Я хочу заменить термин "stomach:biopsy" на число 1. Я хочу сделать это с case_when из dplyr

Я пробовал:

lapply(tryout, function(x) 
    x %>% 
           mutate(group = case_when( 
             grepl("stomach:biopsy",x ) ~ 1
           )))

но я получаю ошибку:

Error in UseMethod("mutate_") : 
  no applicable method for 'mutate_' applied to an object of class "character"

Так как я могу запустить case_when для вложенного списка?

Ответы [ 2 ]

0 голосов
/ 11 января 2019

Проверьте это решение:

library(tidyverse)

tryout <- 
  tibble(
    var = list(
      c("stomach:biopsy", ",colon:biopsy", ",stomach:biopsy"), 
      character(0),
      character(0),
      "oesophagus:biopsy",
      character(0), 
      character(0))
  )

tryout %>%
  mutate(var = map(var, ~case_when(
    .x == 'stomach:biopsy' ~ '1',
    TRUE ~ .x
  ))) %>%
  pull(var)
0 голосов
/ 11 января 2019

Поскольку существует много пустых элементов, мы можем создать индекс, который проверяет, есть ли хотя бы один элемент. Подмножество list и replace основано на шаблоне

i1 <- lengths(tryout) > 0 
tryout[i1] <-  lapply(tryout[i1], function(x) replace(x, x == 'stomach:biopsy', 1))

Если это частичное совпадение, используйте grep, как в сообщении ОП

tryout[i1] <-  lapply(tryout[i1], function(x) 
           replace(x, grep('stomach:biopsy', x), 1))

Обновление

Основываясь на комментариях от OP, необходимо заменить несколько шаблонов. В этом случае лучше создать набор данных key / val или именованный вектор, а затем выполнить left_join/match и т. Д. В этом случае, поскольку это частичное совпадение, было бы лучше использовать regex_left_join из fuzzyjoin

library(fuzzyjoin)
library(tidyverse)
# create a key/val tibble
d1 <- tibble(key = c("stomach:biopsy", "colon:biopsy", 
             "oesophagus:biopsy"), val = 1:3)

# loop through the list elements having at least one element
# left join with the key/val dataset
# pull the column of 'val'
# update the list elements
tryout[i1] <- map(tryout[i1], ~ 
                tibble(key = .x) %>%
                  regex_left_join(d1) %>%
                  pull(val))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...