[英]recode variable in loop R
我試圖在一個循環中重新編碼很多變量(超過53個),但是它不起作用。 有人可以告訴我,我的錯誤在哪里?
我給你一個小例子
data <- read.csv("test.csv", header = TRUE, ";", na = -77)
data$var1 <- recode(data$var1, "1=0; 2=1; 3=2; 4=3; NA=NA")
在這里,我有var 1-59和一些必須以不同方式重新編碼的項目。
我試過了
for (i in 1:59){
get(paste0(data$var",i)) <- recode(paste0("data$var",i), "1=0; 2=1; 3=2; 4=3; NA=NA"
}
和
for (i in c(65, 73, 99){
get(paste0(data$var",i)) <- recode(paste0("data$var",i), "1=0; 2=0; 3=0; 4=1; NA=NA"
}
該准則將不起作用。 我的錯誤在哪里? 有人可以給我個麻煩嗎?
非常感謝你:) derlu
您可以使用switch
函數一次重新編碼值,並使用data.table
重新編碼所有列中的值:
library(data.table)
# function to recode values
myfun <- function(val){
if(is.na(val)) return (NA)
else switch(val, '1'= '0','2' = '1', '3'='2','4'='3')
}
# apply the function to the selected columns
col_names <- paste0('var', 1:59)
df[,(col_names) := lapply(.SD, function(x) unlist(sapply(x, myfun)) ), .SDcols = col_names]
print(df)
更具可讀性的tidyverse
解決方案如何?
library(dplyr)
library(magrittr)
data %<>%
mutate_at(c(1:59) , recode, '1'='0', '2'='1', '3'='2', '4'='3') %>%
mutate_at(c(65,73,99), recode, '1'='0', '2'='0', '3'='0', '4'='1')
如果願意,還可以將字符向量用作傳遞給mutate_at
的第一個參數。 像這樣:
data %<>%
mutate_at(paste0('var', c(1:59)) , recode, '1'='0', '2'='1', '3'='2', '4'='3') %>%
mutate_at(paste0('var', c(65,73,99)), recode, '1'='0', '2'='0', '3'='0', '4'='1')
第三種選擇(由於列太多而不適用於這種情況)是使用vars
:
data %>%
mutate_at(vars(var65, var73, var99), recode, '1'='0', '2'='0', '3'='0', '4'='1')
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.