【问题标题】:Conditional Recoding - Using a Vector of Columns within Mutate_at Together with If_else and Dplyr::Recode条件重新编码 - 使用 Mutate_at 中的列向量以及 If_else 和 Dplyr::Recode
【发布时间】:2018-04-07 07:51:03
【问题描述】:
library(tidyverse)    

使用下面的示例代码,我想创建一个新变量“Filter”,根据相应的非“s”的值重新编码以“s”结尾的变量(q25s、q26s 等...) “ 多变的。例如,如果 q25 = 1,则 q25s 将被重新编码,以便 1 = 0、2=0、3=0、4=1、5=1 和 88=缺失。如果 q25 不等于 1,则 Filter 应为 0。此模式将针对所有其他变量集重复。

但是,为了实现这一点,我尝试使用 tidyverse 创建名为“cols”的列名的命名向量,然后在“mutate_at”函数中使用它以及“if_else”和 dplyr::recode .

下面是一个尝试,但它似乎不起作用。我应该如何更正代码?我对其他建议持开放态度,只要使用 tidyverse 并且代码紧凑,如果可能的话不超过两行......

cols<-c(q25:q29)

Df<-Df%>%mutate_at(vars(q25s:q29s),funs(Filter=if_else(!!cols=1,recode  (.,`1`="a",`2`="b",`3`="c",`4`="d",`5`="e"),"Missing")))

如何使用 tidyverse 实现这一目标?

这里是示例代码:

q25<-c(2,1,88,2,1)
q26<-c(2,88,88,88,2)
q27<-c(2,2,1,1,1)
q28<-c(88,1,1,2,2)
q29<-c(1,1,1,2,2)
q25s<-c(3,5,88,4,1)
q26s<-c(4,4,5,5,1)
q27s<-c(3,3,4,1,4)
q28s<-c(4,5,88,1,3)
q29s<-c(88,88,3,4,4)
Df<-data.frame(q25,q26,q27,q28,q29,q25s,q26s,q27s,q28s,q29s)

【问题讨论】:

    标签: r tidyverse


    【解决方案1】:

    一种选择是通过包含以“q”开头后跟数字(“q\d+”)和“q”后跟数字后跟“s”(“q\d+s”)的列来对数据集进行子集化),然后使用map2,使用ifelse根据'q\d+'列中的值1将相应的列更改为letters

    library(tidyverse)
    cols<-paste0("q", 25:29)
    cols1 <- paste0(cols, "s")
    Df[cols1] <- map2(Df[cols], Df[cols1], ~ifelse(.x == 1, letters[.y], .y) %>%
                                 replace(., is.na(.), "Missing") )
    
    Df
    #  q25 q26 q27 q28 q29 q25s q26s q27s    q28s    q29s
    #1   2   2   2  88   1    3    4    3       4 Missing
    #2   1  88   2   1   1    e    4    3       e Missing
    #3  88  88   1   1   1   88    5    d Missing       c
    #4   2  88   1   2   2    4    5    a       1       4
    #5   1   2   1   2   2    a    1    d       3       4
    

    或者只使用base R

    Df[cols1] <- Map(function(x,y) {
                     x1 <- ifelse(x == 1, letters[y], y)
                     replace(x1, is.na(x1), "Missing")
                     },
                          Df[cols], Df[cols1])
    

    【讨论】:

    • 我忘记了问题的一个重要方面......如果更改代码太多,我可以接受这个答案并询问另一个修改过的答案。我忘了补充,我想根据重新编码创建新变量...例如 q25_new、q26_new 等。
    • 再次嗨,我创建了一个新问题以进一步扩展对此问题的答案。如果你也能看看就太好了!它的标题是-“使用 Purrr::map2 循环两个列名向量,以便有条件地将多个列重新编码为新变量”,。
    猜你喜欢
    • 2019-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-08
    • 1970-01-01
    相关资源
    最近更新 更多