簡體   English   中英

條件重新編碼 - 將 Mutate_at 中的列向量與 If_else 和 Dplyr::Recode 一起使用

[英]Conditional Recoding - Using a Vector of Columns within Mutate_at Together with If_else and Dplyr::Recode

library(tidyverse)    

使用下面的示例代碼,我想創建一個新變量“過濾器”,它根據相應的非“s”變量的值重新編碼以“s”結尾的變量(q25s、q26s 等...)。 因此,例如,如果 q25 = 1,那么 q25s 將被重新編碼,以便 1 = 0、2=0、3=0、4=1、5=1 和 88=Missing。 如果 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)

一種選擇是通過包含以 '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])

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM