0
在函數中執行此代碼時,我得到不同的結果。我錯過了什麼?爲什麼我會在功能內外獲得不同的行爲?
,工程代碼:
adf$GarageCond = as.character(adf$GarageCond)
adf[is.na(adf$GarageCond), "GarageCond"] = "None"
adf$GarageCond = as.factor(adf$GarageCond)
adf$GarageCond = ordered(adf$GarageCond, levels=c("None","Po","Fa","TA","Gd","Ex"))
功能:
cnvtNaAndOrder = function(df, colname)
{
#
# Change NA's to a "None" factor
#
df[,eval(quote(colname))] = as.character(df[,eval(quote(colname))])
adf[is.na(df[,eval(quote(colname))]), eval(quote(colname))] = "None"
df[,eval(quote(colname))] = as.factor(df[,eval(quote(colname))])
df[,eval(quote(colname))] = ordered(df[,eval(quote(colname))], levels=c("None","Po","Fa","TA","Gd","Ex"))
return(df)
}
代碼的直接執行按預期工作:
adf$GarageCond = as.character(adf$GarageCond)
adf[is.na(adf$GarageCond), "GarageCond"] = "None"
adf$GarageCond = as.factor(adf$GarageCond)
adf$GarageCond = ordered(adf$GarageCond, levels=c("None","Po","Fa","TA","Gd","Ex"))
summary(adf$GarageCond)
None Po Fa TA Gd Ex
81 7 35 1326 9 2
str(adf$GarageCond)
Ord.factor w/ 6 levels "None"<"Po"<"Fa"<..: 4 4 4 4 4 4 4 4 4 4 ...
執行的是什麼,在我看來是通過函數等效代碼產生警告並得出不同的結果:
adf = cnvtNaAndOrder(adf, "GarageCond")
Warning message:
In `[<-.factor`(`*tmp*`, iseq, value = c("None", "None", "None", :
invalid factor level, NA generated
summary(adf$GarageCond)
None Po Fa TA Gd Ex NA's
0 7 35 1326 9 2 81
str(adf$GarageCond)
Ord.factor w/ 6 levels "None"<"Po"<"Fa"<..: 4 4 4 4 4 4 4 4 4 4 ...
看起來as.factor()
正在給出警告並且沒有將「無」轉換爲因子。請注意,我也嘗試了df[,"GarageCond"]
表單來選擇直接執行代碼中的列,它工作得很好。
我缺少什麼?爲什麼會有不同的行爲?
在你的函數中如何定義adf?它不是函數的參數,函數內部沒有adf的定義。 –
謝謝 - 我無法檢測到一個簡單的錯字。 adf從我的工作區使用,所以錯誤不明確。令人尷尬和費時。 – jch