[英]R (dplyr/tidyverse) | Using mutate_at to construct a series of new variables using if_else statements
[英]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.