【问题标题】:Passing at once all columns of a data frame as arguments for a function (R)一次将数据框的所有列作为函数 (R) 的参数传递
【发布时间】:2021-05-16 02:49:21
【问题描述】:

对于为我的特殊需要遇到文档是多么困难,我感到非常惊讶。我发现很多关于如何多次调用给定函数的文档,每次都将数据框的不同列作为输入 - 因此通过应用于 eacheach 列/strong> 一个完全相同的功能——。这不是我需要的。

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

例如,让 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

【问题讨论】:

  • 整形为长格式,然后在purrr::reduce或基Reduce中使用函数?
  • 请使用dput(head(df))包含您的数据样本

标签: r dplyr


【解决方案1】:

当你想到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

【讨论】:

    猜你喜欢
    • 2022-01-06
    • 1970-01-01
    • 1970-01-01
    • 2019-07-23
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 2015-05-29
    • 2022-01-02
    相关资源
    最近更新 更多