r - 如何将同一个函数应用于R中的多个变量?

标签 r function for-loop lapply

我知道已经有人提出类似的问题(例如 Passing list element names as a variable to functions within lapplyR - iteratively apply a function of a list of variables ),但我无法根据这些帖子找到解决我的问题的方法。

我有一个事件数据集(约 100 个变量,>2000 个观察值),其中包含带有相关参与者信息的变量。一个变量只能包含一个参与者,因此如果事件涉及多个参与者,它们将分布在多个变量中(例如actor1actor2,...)。这些参与者可以分为两组(“s”和“nons”)。为了以后使用,我需要两个 Actor 列表:一个包含“s”类别的所有 Actor ,另一个包含“nons”类别的所有 Actor 。 “s”仅由三位 Actor 组成,而“nons”则由数十名 Actor 组成。

# create example data
df <- data.frame(id = c(1:8),
                 actor1 = c("A", "B", "D", "E", "F", "G", "H", NA),
                 actor2 = c("A", NA, "B", "C", "E", "I", "D", "G"))

df <-  
  df %>%
  mutate(actor1 = as.character(actor1),
         actor2 = as.character(actor2))

由于我即将准备的脚本应该在将来的数据集的更新版本上使用,因此我希望尽可能实现自动化,并尽可能限制脚本中需要调整的部分尽可能。我的想法是为每个类别创建一个函数,从列表中的一个变量(例如actor1)中提取相应类别的参与者(例如“nons”),然后在另一个函数上“循环”这个函数变量(最好使用apply系列)。

我知道每个 Actor 属于哪个类别(“A”、“B”和“C”是类别“s”),这使我能够定义下面函数中使用的分离规则(过滤命令)。

# create function
nons_function <- function(col) {
  col_ <- enquo(col)
  nons_list <-
    df %>%
    filter(!is.na(!!col_), !!col_ != "A", !!col_ != "B", !!col_ != "C") %>%
    distinct(!!col_) %>%
    pull()
  nons_list
}

# create list of variables to "loop" over
actorlist <- c("actor1", "actor2")

结果如下。我得到的不是两个 Actor 列表,而是一个包含变量名称作为字符串的列表。

> lapply(actorlist, nons_function)
[[1]]
[1] "actor1"

[[2]]
[1] "actor2"

我想要得到的是如下内容:

> lapply(actorlist, nons_function)
[[1]]
[1] "D" "E" "F" "G" "H"

[[2]]
[1] "E" "I" "D" "G"

问题可能是我在lapply中将变量名称传递给我的函数的方式。显然,我的函数无法使用字符输入作为变量名。但是,我还没有找到一种方法来以允许字符输入的方式调整我的函数,或者为我的函数提供一个变量列表,以便以它可以消化的方式循环。

感谢任何帮助!

编辑:最初,我以一种误导性的方式命名了 Actor ( Actor 的名字表明了 Actor 属于哪个类别),这导致了对我的情况没有真正帮助的答案。我现在已将 Actor 名称从“s1”、“s2”、“nons1”、“nons2”等更改为“A”、“B”、“C”等。

最佳答案

这是一个使用基本 r 的选项。

对于非 Actor :

lapply( df[, 2:3], function(x) grep( "^nons", x, value = TRUE ) )

#$actor1
#[1] "nons1" "nons2" "nons3" "nons4" "nons5"
#
#$actor2
#[1] "nons2" "nons6" "nons1" "nons4"

对于主角:

lapply( df[, 2:3], function(x) grep( "^s", x, value = TRUE ) )

# $actor1
# [1] "s1" "s2"
# 
# $actor2
# [1] "s1" "s2" "s3"

关于r - 如何将同一个函数应用于R中的多个变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58626472/

相关文章:

javascript - for 循环的当前迭代返回 undefined 并且函数的返回是 undefined

r - 设置一个绘图缩放以匹配 Shiny 中另一个绘图缩放的缩放

r - 用另一个掩码数据框揭示一个数据框的值

r - 自定义ggtitle的背景颜色

r - 在自定义 dplyr 函数中更改结果变量的名称

java - 为什么程序不计算利息?

r - 如何记录 RcppExports.R 链接函数?

visual-studio - CMake:如何将 .def 文件添加到 Visual Studio 项目过滤器?

c++ - std::function 的开销

python - 使用 Pandas 通过列循环字典