首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用case_when创建列表

如何使用case_when创建列表
EN

Stack Overflow用户
提问于 2019-01-11 21:02:08
回答 2查看 1.6K关注 0票数 1

我有一份清单,如下:

代码语言:javascript
复制
   tryout<- list(c("stomach:biopsy", ",colon:biopsy", ",stomach:biopsy"), 
        character(0), character(0), "oesophagus:biopsy", character(0), 
        character(0))

我想用数字1替换术语"stomach:biopsy"。我想用来自dplyrcase_when来实现

我试过了:

代码语言:javascript
复制
lapply(tryout, function(x) 
    x %>% 
           mutate(group = case_when( 
             grepl("stomach:biopsy",x ) ~ 1
           )))

但是我得到了一个错误:

代码语言:javascript
复制
Error in UseMethod("mutate_") : 
  no applicable method for 'mutate_' applied to an object of class "character"

那么,如何为嵌套列表运行case_when呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-01-11 21:07:19

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

代码语言:javascript
复制
i1 <- lengths(tryout) > 0 
tryout[i1] <-  lapply(tryout[i1], function(x) replace(x, x == 'stomach:biopsy', 1))

如果是部分匹配,则使用grep,就像在OP的post中一样

代码语言:javascript
复制
tryout[i1] <-  lapply(tryout[i1], function(x) 
           replace(x, grep('stomach:biopsy', x), 1))

更新

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

代码语言:javascript
复制
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))
票数 4
EN

Stack Overflow用户

发布于 2019-01-11 21:11:16

检查此解决方案:

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54147090

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档