簡體   English   中英

在循環R中重新編碼變量

[英]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.

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