如何在列表中使用case_when

时间:2019-01-11 13:02:08

标签: r

我的列表如下:

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

我想用数字1代替术语"stomach:biopsy"。我想用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 :(得分:4)

由于空白元素很多,我们可以创建一个索引来检查是否至少有一个元素。根据模式将listreplace子集

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

如果它是部分匹配项,则按照OP的帖子使用grep

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

更新

根据OP的评论,有多种模式需要替换。在这种情况下,最好先创建一个键/值数据集或命名向量,然后执行left_join/match等。在这种情况下,由于它是部分匹配项,因此最好使用{{1 }}来自regex_left_join

fuzzyjoin

答案 1 :(得分:0)

检查此解决方案:

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)