如何根据传递给 R 中函数的参数值重估 factor 中的元素?

How can I revalue elements in factor based on values of arguments, passed to the function in R?

我有一个函数,我将某些值传递给一个因子中的水平。我想根据这个值重估因子水平。

例如,如果我想重估因子 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 fromvalues were not present inx: member1, member2)。

请告诉我如何正确操作?
也许我需要使用 revalue.

以外的东西

您引用了 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(“猫”->“动物”,“松树”->“树”)”然后用[=31=测试它]

levels(my_factor)<- reval(my_factor, reassigns = list (list("cats" , "animals"),
                                           list("pines", "trees") ) )

如果它不起作用,那么您应该 post R 代码来创建一个可用于进一步开发和测试的示例。查看 dplyr 索引,我看到 recode 函数有一个 factor 方法。这是该帮助页面中的示例,似乎符合您的需求:

# 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))

(几乎)总是,R 不会实际修改 factor_vec,除非您将重新编码的结果分配回原始名称

factor_vec <- recode(factor_vec, a = "Apple", .default = levels(factor_vec))