【问题标题】:How to recode a set of variables in a dataframe in R如何在R中的数据框中重新编码一组变量
【发布时间】:2014-11-20 13:37:24
【问题描述】:

我有一个数据框,其中包含从 1 到 5 的值的不同变量。我想以 5 变为 1 的方式重新编码一些变量,反之亦然 (x=6-x)。 我想定义一个变量列表,将在我的数据框中像这样重新编码。

这是我使用lapply 的方法。我还没有真正理解它。

  #generate example-dataset
    var1<-sample(1:5,100,rep=TRUE)
    var2<-sample(1:5,100,rep=TRUE)
    var3<-sample(1:5,100,rep=TRUE)
    dat<-as.data.frame(cbind(var1,var2,var3))

    recode.list<-c("var1","var3")  
    recode.function<- function(x){          
    x=6-x
     }
    lapply(recode.list,recode.function,data=dat)

【问题讨论】:

  • 在这种情况下计算 6-x 非常简单,但如果您有更具体的重新编码模式,您可能需要检查“汽车”包中的自定义“重新编码”功能。

标签: r reverse lapply recode


【解决方案1】:

不需要外部函数或包。只需在lapply 中使用匿名函数,如下所示:

df[recode.list] <- lapply(df[recode.list], function(x) 6-x)

使用[] 可以让我们直接替换原始数据集中的那些列。这是必需的,因为仅使用lapply 会导致数据命名为list


如 cmets 中所述,您实际上甚至可以跳过 lapply

df[recode.list] <- 6 - df[recode.list] 

【讨论】:

  • 感谢您的帮助。不知何故,将您的代码应用于我的数据时,我收到以下消息:“[.data.frame(df, recode.list) 中的错误:选择了未定义的列”。这可能意味着什么?
  • @user2982730,听起来这意味着您的“recode.list”包含在源data.frame中找不到的列。
【解决方案2】:

您可以从plyr 使用mapvalues

require(plyr)
# if you just want to replace 5 with 1 and vice versa
df[, recode.list] <- sapply(df[, recode.list], mapvalues, c(1, 5), c(5,1))
# if you want to apply to x=6-x to all values (in this case you don't need mapvalues)
df[, recode.list] <- sapply(df[, recode.list], mapvalues, 1:5, 5:1)

【讨论】:

  • mapvalues 对我不起作用。相反,我使用了汽车包中的重新编码。也就是说,只有在知道变量有多少个不同的值并且没有太多需要重新编码的值时,重新编码才有用。
【解决方案3】:

这里有一个使用dplyr 的选项:

recode.function<- function(x){          
  x <- 6-x 
}

recode.list <- c("var1","var3") 

require(dplyr)
df %>% mutate_each_(funs(recode.function), recode.list)

#    var1 var2 var3
#1      2    2    4
#2      3    3    3
#3      3    5    2
#4      3    3    2
#5      4    3    3
#6      5    4    1
#...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-23
    • 2022-11-28
    • 2015-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多