为什么我不能在函数中使用lapply因子?

时间:2016-08-02 21:44:38

标签: r lapply

我有一个标有q1,q2,q3等列的数据框。我想创建一个带参数的函数(变量名,数据框,水平向量,标签向量)并将编码的答案更改为字符串。

例如,如果q3编码为1,2或3,我想将其更改为“bad”,“中性”,“良好”AND q4是一系列4列(q4r1,q4r2,q4r3, q4r4)编码响应1,2或3,我想将它们更改为“红色”,“蓝色”,“绿色”:

findCol <- function(vn, df) {
  if (length(which(grepl(vn, names(df)))) > 1) {
    which(grepl(vn, names(df)))
  } else {
    which(colnames(df)==vn)
  }
}

labelChng <- function(cv, df, levs, labs) {
  if (length(cv) > 1) {
    df[cv[1]:cv[length(cv)]] <- lapply(df[cv[1]:cv[length(cv)]], factor, 
    levels = levs, labels = labs)
  } else {
    df[cv] <- lapply(df[cv], factor, levels = levs, labels = labs)
  }
}

然后

q3c <- findCol("q3", myData)
q3lev <- c(1:3)
q3lab <- c("bad", "neutral", "good")
q4c <- findCol("q4", myData)
q4lev <- c(1:3)
q4lab <- c("red", "blue", "green")

findCol函数工作正常,但是当我尝试运行labelChng时,它实际上并没有改变任何东西。当我直接在控制台中运行它时:

myData[q4c[1]:q4c[length(q4c)]] <- lapply(myData[q4c[1]:q4c[length(q4c)]], factor, 
levels = q4lev, labels = q4lab)

它工作正常,但不是我使用时:

labelChng(q4c, myData, q4lev, q4lab)

我是新手,所以可能会遗漏一些明显的东西。任何反馈都有帮助。

2 个答案:

答案 0 :(得分:3)

你的第二个函数没有返回值,可以简化:

#Simplified Helpers
findCol <- function(vn, df) grepl(vn, names(df))

labelChng <- function(cv, df, levs, labs) {
  df[cv] <- lapply(df[cv], factor, levels=levs, labels=labs)
  return(df)
}

myData <- data.frame(q1=1:3, q2=3:1, q3=2)
myData
#   q1 q2 q3
# 1  1  3  2
# 2  2  2  2
# 3  3  1  2


q2c <- findCol('q2', myData)
q2lev <- c(1:3)
q2lab <- c("bad", "neutral", "good")
labelChng(q2c, myData, q2lev, q2lab)
#   q1      q2 q3
# 1  1    good  2
# 2  2 neutral  2
# 3  3     bad  2

答案 1 :(得分:1)

另一种方法是使用plyr包。 plyr库有两个有用的revaluemapvalues函数,用于将一组因子转换为另一组因子。这是一个例子:

library(plyr)
df<-data.frame(x=1:3)
df$x<-as.factor(df$x)
q3lev <- c(1:3)
q3lab <- c("bad", "neutral", "good")

df$x<-mapvalues(df$x, from=q3lev, to=q3lab)