首页 > 解决方案 > 一次将数据框的所有列作为函数 (R) 的参数传递

问题描述

对于因我的特殊需要而遇到文档是多么困难,我真的很惊讶。我发现很多关于如何多次调用给定函数的文档,每次都将数据框的不同列作为输入——因此通过对每一列应用相同的函数来改变每一列——。这不是我所要求的。

相反,我只想调用给定函数一次,并将数据框的所有列作为参数传递给它。也就是说,使用数据框中的所有变量作为输入,我想创建一个新变量。

例如,设df为以下数据框:

V1 V2 V3
2019-07-15 UTC--2020-07-15 UTC 2020-09-17 UTC--2022-09-17 UTC 2018-07-19 UTC--2018-09-19 UTC
2019-07-15 UTC--2020-07-15 UTC 2020-09-17 UTC--2022-09-17 UTC 2018-07-20 UTC--2019-07-20 UTC

请注意,所有三个变量都是通过 lubridate 包创建的区间。

现在,我想创建一个显示区间交集的新列。

df = df %>% mutate(new_variable = lubridate::intersect(V1, V2, V3))

由于df只有几列,而且它们都没有一个复杂或长的名称,所以必须显式地写出每个变量的名称并不太麻烦。但是,如果我的数据框没有 3 列,例如 10 列,那么编写列名将不再是明智之举。实际上,众所周知,程序员是懒惰的,我也不例外:我不想写下列名,即使我正在处理单列数据框。

编辑

这可能与手头的问题有关。令x为以下区间向量:

[1] 2019-07-15 UTC--2020-07-15 UTC 2017-11-22 UTC--2017-11-22 UTC
[3] 2020-09-17 UTC--2022-09-17 UTC 2018-07-19 UTC--2018-09-19 UTC
[5] 2018-07-20 UTC--2019-07-20 UTC 2018-07-20 UTC--2019-07-20 UTC

现在,我将尝试使用 do.call 来将x的每个元素作为参数传递给 intersect 函数。

> do.call(lubridate::intersect, list(x))

Error in int_standardize(y) : 
  el argumento "y" está ausente, sin valor por omisión

错误消息转换为argument "y" is absent, with no default value.

标签: rdplyr

解决方案


当你想到 时,你已经很亲密了do.call()

您的示例不包含交集,因此我添加了一行相交。我还加了id一行:

df = structure(list(id = 1:3, V1 = new("Interval", .Data = c(31622400, 31622400, 34300800), start = structure(c(1563148800, 1563148800, 1563148800), class = c("POSIXct", "POSIXt"), tzone = "UTC"), tzone = "UTC"), V2 = new("Interval", .Data = c(63072000, 63072000, 65750400), start = structure(c(1600300800, 1600300800, 1594944000), class = c("POSIXct", "POSIXt"), tzone = "UTC"), tzone = "UTC"), V3 = new("Interval", .Data = c(5356800, 31536000, 34214400), start = structure(c(1531958400, 1532044800, 1532044800), class = c("POSIXct", "POSIXt"), tzone = "UTC"), tzone = "UTC")), row.names = c(NA, -3L), class = c("tbl_df", "tbl", "data.frame"))

library(tidyverse)
library(lubridate)

df %>% 
  mutate(id=row_number()) %>% 
  pivot_longer(-id) %>% 
  group_by(id) %>% 
  summarise(var=do.call(intersect, as.list(value)))
# A tibble: 3 x 2
#    id  var                           
# <int>  <Interval>                    
#     1  NA--NA                        
#     2  NA--NA                        
#     3  2020-07-17 UTC--2020-08-15 UTC

推荐阅读