【问题标题】:How to makes separate sets from objects in `...` in an R function如何在 R 函数中的“...”中创建单独的对象集
【发布时间】:2019-05-20 20:22:47
【问题描述】:

在下面的函数foo中,如果用户输入4个data.frames abxy,函数有没有办法rbind这些基于a请求set.size

例如,如果用户使用set.size = c(2, 2),那么前两个data.frames(ab)将是rbinded,然后是x y 将是rbinded。

这可以实现吗?

a <- data.frame(d = 1, cont = T)
b <- data.frame(d = 3, cont = T)
x <- data.frame(d = 3:5, cont = c(F, F, F))
y <- data.frame(d = 1:3, cont = c(F, F, F))


foo <- function(..., set.size = c(2, 2)){

  rbind(... = ...)
}

【问题讨论】:

  • 当然,但如果您让用户提供一个分组变量来指示要组合的数据帧,则实现起来可能会更简单。在您的示例中,set.size = c(1,1,2,2).
  • 本例中 foo 的预期输出是什么?

标签: r function loops dataframe


【解决方案1】:

一个选项是

foo <- function(..., set.size = c(2, 2)){
    v1 <- rep(seq_along(set.size), set.size)
    lst1 <- list(...)
    lapply(split(lst1, v1), function(x) do.call(rbind, x))

}

foo(a, b, x, y, set.size = c(2, 2))

数据

a <- data.frame(d = 1, cont = T)
b <- data.frame(d = 3, cont = T)
x <- data.frame(d = 3:5, cont = c(F, F, F))
y <- data.frame(d = 1:3, cont = c(F, F, F))

【讨论】:

  • @rnorouzian 抱歉,我错过了那部分。它类似于其他答案
  • @rnorouzian 现在,您将输入作为list 对象而不是data.frame。不清楚rbind
  • @rnorouzian 不清楚你想如何概括。您作为输入的一般结构是什么。它是基于删除“k”元素还是必须检查data.frame对象
  • @rnorouzian 可能会有所帮助foo &lt;- function(..., set.size = c(2, 2)){ v1 &lt;- rep(seq_along(set.size), set.size); lst1 &lt;- list(...); lst2 &lt;- lapply(lst1, function(x) lapply(x, function(y) y[sapply(y, is.data.frame)][[1]])[[1]]); lapply(split(lst2, v1), function(x) do.call(rbind, x)) } ; foo(gg, zz, tt, ss, set.size = c(2, 2))
【解决方案2】:

这是一个使用 Joran 建议的形式的“分组”参数的选项:

a <- data.frame(d = 1, cont = TRUE)
b <- data.frame(d = 3, cont = TRUE)
x <- data.frame(d = 3:5, cont = c(FALSE, FALSE, FALSE))
y <- data.frame(d = 1:3, cont = c(FALSE, FALSE, FALSE))

foo <- function(..., ii) {
    ll <- split(list(...), ii)
    lapply(ll, function(X) do.call(rbind, X))
}

## Try it out
foo(a, b, x, y, ii = c(1,1,2,2))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-05
    • 2014-07-15
    • 2020-07-09
    • 1970-01-01
    • 1970-01-01
    • 2017-09-24
    • 1970-01-01
    相关资源
    最近更新 更多