【问题标题】:Conditional mutate with if else list of character vectors %in% vector of variables. Including test data [duplicate]条件变异与 if else 字符向量列表 %in% 变量向量。包括测试数据[重复]
【发布时间】:2020-03-12 10:10:47
【问题描述】:

我正在对一个数据框进行排序,其中有许多不同的诊断信息, 即变量 v1、v2、v3。诊断测试可以给出分类结果,例如“Sick”、“Sick2”或“nosick”。患者已连续数年接受这些诊断——“年”。

我想创建一个新变量“Eval”,如果任何一个或多个诊断变量包含积极响应,即“生病”,它将把患者归类为生病 (1) " 或 "Sick2" 否则病人没有生病 (0)

testframe %>% group_by(year) %>% mutate(Eval=ifelse(any(sickvars %in% sickv)==TRUE,1,0))

但是,上述调用还将没有积极响应的年份评估为 1。

我也没有成功:

testframe %>% group_by(year) %>% mutate(if(any(sickvars %in% sickv)==TRUE){Eval <- 1} else {Eval <- 0})

这是一个要使用的测试框架。

#Create testframe
v1 <- c("Sick","nosick","nosick","nosick","nosick")
v2 <- c("nosick","nosick","Sick2","nosick","nosick")
v3 <- c("nosick","Sick","Sick","nosick","nosick")

sickv <- c("Sick","Sick2")
sickvars <- c(v1,v2,v3)
year <- c(1,2,3,4,5)
testframe <- data.frame(sickid,v1,v2,v3)

【问题讨论】:

    标签: r if-statement conditional-statements dplyr


    【解决方案1】:

    我们可以使用pmap 找出sickvars 列中的任何值是否包含anysickv

    library(dplyr)
    testframe %>%
       mutate(Eval = purrr::pmap_int(select(., sickvars), ~any(c(...) %in% sickv)))
    
    #  year     v1     v2     v3 Eval
    #1    1   Sick nosick nosick    1
    #2    2 nosick nosick   Sick    1
    #3    3 nosick  Sick2   Sick    1
    #4    4 nosick nosick nosick    0
    #5    5 nosick nosick nosick    0
    

    在基础 R 中,我们可以使用 lapplyReduce

    testframe$eval <- +(Reduce(`|`, lapply(testframe[sickvars], `%in%`, sickv)))
    

    数据

    v1 <- c("Sick","nosick","nosick","nosick","nosick")
    v2 <- c("nosick","nosick","Sick2","nosick","nosick")
    v3 <- c("nosick","Sick","Sick","nosick","nosick")
    sickv <- c("Sick","Sick2")
    sickvars <- c("v1","v2","v3")
    year <- c(1,2,3,4,5)
    testframe <- data.frame(year,v1,v2,v3, stringsAsFactors = FALSE)
    

    【讨论】:

    • 谢谢你,这很好用。为什么需要 stringsasfactors= FALSE? %in% 不会自动转换字符串中的因子吗?向量 sickvsickvars 必须用引号引起来吗?这和准报价有关系吗?有没有什么办法,比如把 this 放到一个函数中,就不需要解析带引号的字符串的函数向量了?
    • @Silvicultureist 否 %in% 不会直接将因子转换为字符。你需要 sickvsickvars 在不在函数中时用引号引起来(如这里)。如果你想在函数中使用它们,那么它可以带引号或不带引号。答案会有所不同。
    猜你喜欢
    • 2021-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-04
    • 2022-08-19
    • 1970-01-01
    • 2021-12-08
    • 1970-01-01
    相关资源
    最近更新 更多