我有一個函式,我向它傳遞某些作為因子水平的值。我想根據這個值重新評估因子水平。
例如,如果我想重估因子中的級別my_factor(“貓”->“動物”、“松樹”->“樹”),我使用:
my_factor <- revalue(my_factor, c("cats"="animals", "pines"="trees"))。但是現在我想根據傳遞給函式的引數值重新評估級別:
myFunction(..., member1 = "cats", member2 = "pines") {
my_factor <- revalue(my_factor, c(member1="animals", member2="trees"))
}
此代碼片段不起作用(Error: The following 來自values were not present inx : member1, member2)。
請告訴我如何正確地做到這一點?
也許我需要使用除revalue.
uj5u.com熱心網友回復:
您參考了plyr,但該軟體包已“停用”,通常不建議使用。我不會以這種dplyr方式嘗試解決方案,因為我對它的各種抽象級別沒有足夠的掌握。
基本功能levels<-將干凈利落地做到這一點。當您執行以下操作時:
levels(fac)[some_index] <- "something"
您可以更改該級別的列印值而不更改攜帶資訊的因子整數的基本模式。所以使用levels(fac); 一次獲取級別的當前值以創建一個邏輯索引以在 "[" 內部使用,并再次在 LHS 的“外部”進行重新分配:
levels(fac)[ levels(fac) == "cats"] <- "animals"
levels(fac)[ levels(fac) == "pines"] <- "trees"
您實際上正在使用兩種不同的功能:(levels<-在外部)和levels(在內部)。為了使這個程序成為一個可以處理任意數量的重新分配的函式,您需要將重新分配對包含在一個串列串列中,以便您可以迭代這些對。您當前的請求嘗試使用語言類運算式,比如"cats" = "animals",但是這將創建一個名為引數cats與值"animals"。查看plyr::revalue我的代碼可以看到它然后需要在它發送名稱和值之前撤消該構造,然后將名稱和值發送到mapvalues使用兩個單獨的引數集。無論如何,這是一個老派的嘗試。
reval <- function(x)(fac, reassigns) {
levs <-lapply(reassigns, function(fac, pair) {
levels(fac)[levels(fac)==pair[[1]]] <-pair[[2]]}
return(levs) }
你會這樣稱呼它:
levels(facname) <- reval ( facname, list( list("curlev1", "newlev1"),
list("curlev2", "newlev2")) ) )
如果您在使用“my_factor(“cats”->“animals”,“pines”->“trees”)”的示例命名中有一個示例,然后使用
levels(my_factor)<- reval(my_factor, reassigns = list (list("cats" , "animals"),
list("pines", "trees") ) )
如果它不起作用,那么您應該發布 R 代碼來創建一個可用于進一步開發和測驗的示例。查看dplyr索引,我看到了recode具有因子方法的函式。這是來自該幫助頁面的示例,它似乎符合您的需求:
# For factor values, use only named replacements
# and supply default with levels()
factor_vec <- factor(c("a", "b", "c"))
recode(factor_vec, a = "Apple", .default = levels(factor_vec))
與(幾乎)總是一樣,factor_vec除非您將重新編碼的結果分配回原始名稱,否則R 不會實際修改
factor_vec <- recode(factor_vec, a = "Apple", .default = levels(factor_vec))
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/351969.html
上一篇:PythonTkinter,無法獲得作為孩子的checkbutton的價值
下一篇:如何檢測字串中的數字字符
