2016-08-02 90 views
0

我有一個數據框的列標記爲q1,q2,q3等。我想創建一個函數,它將採用參數(變量名稱,數據框架,水平矢量,標籤矢量)並將編碼答案更改爲字符串。例如,如果q3編碼爲1,2或3,並且我想將其更改爲「bad」,「neutral」,「good」AND q4是一系列4列(q4r1,q4r2,q4r3 ,q4r4)與編碼應答1,2,或3,我想改變那些 「紅」, 「藍」, 「綠」:爲什麼我不能在函數中使用lapply因子?

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

第一個函數可以縮寫爲'findCol < - function(vn,df)which(grepl(vn,names(df)))'? –

+1

我認爲你並沒有真正做出改變。您在'labelChng'函數中操作的'df'只在該函數的本地。如果你想改變某些東西,你應該使用'return(df)' –

+1

@MikeyMike我在想同樣的東西 –

回答

2

你的第二個函數沒有返回值,可以簡化爲:

#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 
+0

也許值得指出的是'cv [1]:cv [length(cv)]'是個不錯的主意。如果它與普通的'cv'有所不同,它會做奇怪的事情(改變不符合grepl標準的cols)。 – Frank

+1

哦,我還沒有進入破碎。 –

+1

是的 - 我現在看到了這個問題。謝謝! – j8sR

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) 
相關問題