gpt4 book ai didi

r - 在 lapply 调用中改变传递给函数的参数

转载 作者:行者123 更新时间:2023-12-01 13:18:21 25 4
gpt4 key购买 nike

一般问题

我想在 lapply/sapply(或者 mapply?)调用中改变传递给函数的附加参数。很高兴知道一般如何做到这一点。不过,如果这很重要,出于我的特定目的,我会尝试将其合并到自定义函数中。 (所以希望它可以扩展)。

问题的具体例子

假设我有以下数据框:

df <- data.frame(column1 = letters[1:4], 
column2 = LETTERS[1:4],
column3 = 1:4,
stringsAsFactors = FALSE)

例如,我想将 column1 和 column2 转换为因子,每个因子都有不同的水平。我可能会这样记下列和级别:

# Columns in df I want to apply the factor() function to.

cols <- c("column1", "column2")

# Desired levels for column1

column1_lvl <- c(letters[1:5])

# Desired levels for column2

column2_lvl <- c(LETTERS[1:6])

请注意,我为列指定了两个单独的级别,每个级别的级别都比 df 中存在的级别多。这是改变论点的动机。现在,我测试了一个 lapply 调用, 将级别参数更改为 factor:

     df[cols] <- lapply(df[,cols], factor)

这有效并成功地将这些列转换为因子。我将 df 重新定义为下一步的原始结构。现在我想为每一列指定级别。在 ?lapply 中,它说您可以将额外的参数传递给 FUN,但它没有指定如何在 X 。用一个实例试试这个,我可以这样写:

     df["column1"]<- factor(df[,"column1"], levels = column1_lvl)

这行得通。但现在我想抽象化 levels 参数。不幸的是,这不起作用,因为无论您为 levels 分配什么,R 都会尝试将该参数用于 X 每个向量.

理想情况下,像下面这样的东西会起作用。 以下是假代码,我希望它能按我想要的方式工作,但没有:

     df[cols] <- lapply(df[,cols], factor, level = list(column1_lvl, column2_lvl))

我尝试过的

我无法找到许多资源来解释我如何能够完成此任务。或许,我看不出需要做什么。 This post对我有一点帮助,但我想知道是否有办法创建我自己的 factor 函数,例如。

此外,this person's answer他们自己的问题鼓励我查看 mapply。虽然我已经阅读了 ?mapply 的文档,并遵循了一些教程,但我还是无法弄明白。在这方面,我尝试了以下代码,但它不起作用(出于我的目的):

     col_levels <- list(column1_lvl, column2_lvl)
df[cols] <- mapply(factor, df[,cols], MoreArgs = col_levels)

session 信息

> sessionInfo()
R version 3.5.1 (2018-07-02)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows >= 8 x64 (build 9200)

Matrix products: default

locale:
[1] LC_COLLATE=English_United States.1252 LC_CTYPE=English_United States.1252 LC_MONETARY=English_United States.1252
[4] LC_NUMERIC=C LC_TIME=English_United States.1252

attached base packages:
[1] stats graphics grDevices utils datasets methods base

loaded via a namespace (and not attached):
[1] compiler_3.5.1 tools_3.5.1 yaml_2.1.19

最后的想法

我可能只是很难知道要搜索什么。如果你能给我指出正确的方向,我总是乐于自己解决问题。我们非常欢迎任何其他资源。

提前致谢!

最佳答案

我们可以使用 Maplevels 列更改为 list 中相应的“lvl”对象

df[cols] <- Map(function(x, y) factor(x, levels = y),
df[cols], list(column1_lvl, column2_lvl))

并检查列的级别

lapply(df[cols], levels)
#$column1
#[1] "a" "b" "c" "d" "e"

#$column2
#[1] "A" "B" "C" "D" "E" "F"

正如 OP 提到的一种使用 lapply 解决此问题的方法,lapply 的一个选项是遍历序列,然后对数据和相应的“lvls”进行子集 列表

lvls_lst <- list(column1_lvl, column2_lvl)
df[cols] <- lapply(seq_along(lvls_lst), function(i)
factor(df[cols][[i]], levels = lvls_lst[[i]]))

注意:在这两种情况下,我们都需要明确指定级别

关于r - 在 lapply 调用中改变传递给函数的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52487840/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com