如何根据传递给 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 in
x: 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))
我有一个函数,我将某些值传递给一个因子中的水平。我想根据这个值重估因子水平。
例如,如果我想重估因子 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 in
x: 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))