首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >重新编码循环R中的变量

重新编码循环R中的变量
EN

Stack Overflow用户
提问于 2018-07-21 04:46:04
回答 2查看 1.5K关注 0票数 0

我试图在一个循环中重新编码许多变量(超过53个),但它不会起作用。有没有人能告诉我,我的错误在哪里?

我给你举个小例子

代码语言:javascript
运行
复制
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和几个项目,必须以不同的方式重新编码。

我试过了

代码语言:javascript
运行
复制
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"
}

代码语言:javascript
运行
复制
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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-07-21 18:59:49

可读性更好的tidyverse解决方案如何?

代码语言:javascript
运行
复制
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的第一个参数。如下所示:

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
data %>% 
  mutate_at(vars(var65, var73, var99), recode, '1'='0', '2'='0', '3'='0', '4'='1')
票数 0
EN

Stack Overflow用户

发布于 2018-07-21 05:16:36

您可以使用switch函数对值进行重新编码,并使用data.table一次性对所有列中的值进行重新编码:

代码语言:javascript
运行
复制
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)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51450153

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档