我有一个标有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)
我是新手,所以可能会遗漏一些明显的东西。任何反馈都有帮助。
答案 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库有两个有用的revalue
和mapvalues
函数,用于将一组因子转换为另一组因子。这是一个例子:
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)