我试图在一个循环中重新编码许多变量(超过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")这里我有变量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
发布于 2018-07-21 18:59:49
可读性更好的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')发布于 2018-07-21 05:16:36
您可以使用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)https://stackoverflow.com/questions/51450153
复制相似问题