将向量和数据帧的单行合并为一个列表

时间:2019-03-01 22:29:14

标签: r

我正在尝试从向量和数据行中组装一个列表 帧。该列表将作为参数传递给do.call() 功能。如果向量的长度为1,没问题。

tbl <- tibble::tibble(a = 1:4,
              b = letters[1:4])

vec <- 1
works <- c(avec = vec, as.list(tbl[1,]))
testit <- function(avec, a, b){
  length(avec) + length(a) + length(b)
}
do.call(testit, works)
#> [1] 3

但是它也需要使用更长的向量

vec <- 1:2 
broken <- c(avec = vec, as.list(tbl[2,]))# breaks apart avec
do.call(testit, broken)
#> Error in (function (avec, a, b) : unused arguments (avec1 = 1, avec2 = 2)

toomany <- list(avec = vec, as.list(tbl[2,]))#too many layers
do.call(testit, toomany)
#> Error in (function (avec, a, b) : argument "b" is missing, with no default


#what I want:
whatIwant <- list(avec = 1:2, a = 2, b = "b")
do.call(testit, whatIwant)
#> [1] 4

是否有数据框都没有关系,我希望解决方案可以同时使用 无论如何还是小玩意儿和数据框。

adf <- data.frame(a = 1:4,
                  b = letters[1:4], stringsAsFactors = FALSE)
list(avec = vec, as.list(adf[1,]))
#> $avec
#> [1] 1 2
#> 
#> [[2]]
#> [[2]]$a
#> [1] 1
#> 
#> [[2]]$b
#> [1] "a"

我尝试过的其他事情。

purrr::flatten(toomany) # breaks up avec again
#> [[1]]
#> [1] 1
#> 
#> [[2]]
#> [1] 2
#> 
#> $a
#> [1] 2
#> 
#> $b
#> [1] "b"
c(avec = vec, as.list(adf[1,]), recursive = TRUE)
#> avec1 avec2     a     b 
#>   "1"   "2"   "1"   "a"
list(avec = vec, as.vector(adf[1,]))
#> $avec
#> [1] 1 2
#> 
#> [[2]]
#>   a b
#> 1 1 a
list(vec, unlist(adf[1,]))
#> [[1]]
#> [1] 1 2
#> 
#> [[2]]
#>   a   b 
#> "1" "a"

我认为这不会那么难!我是否必须将清单汇总到 文本并解析吗?我想念一些东西。创建于2019-03-01 reprex package(v0.2.0)。

0 个答案:

没有答案