将项目粘贴到列表中,其中某些项目包含矢量

时间:2018-09-20 15:25:57

标签: r

我正在尝试为API建立查询,并且我有一个函数,该函数是列表中的参数和值。如果我的某些参数具有多个值,我会遇到问题。例如,

paramlist1 <- list(
  a = "1",
  b = "2",
  c = "3",
  d = "4"
)
paste(names(paramlist1), "=", paramlist1, collapse = "&", sep="")

工作正常。但是我有一些参数可以包含多个值。例如,

paramlist2 <- list(
  a = "1",
  b = "2",
  c = c("3", "4"),
  d = c("5", "6")
)

我想返回2个字符串: a=1&b=2&c=3&d=5a=1&b=2&c=4&d=6

也许我创建此参数列表的方法不是最好的。谢谢

3 个答案:

答案 0 :(得分:5)

您需要重复较短的向量,使其长度与较长的向量相同。一种方法是将列表转换为data.frame,然后可以将apply函数paste应用于每一行:

myfun <- function(x) paste(names(x), "=", x, collapse="&", sep="")

apply(as.data.frame(paramlist2), 1, myfun)

答案 1 :(得分:1)

我们检查lengths中的list,得到max的长度('mx'),其依据是附加了长度较短的paramlist2元素,其中{ {1}},NA到两列stackdata.framefill元素以及上面与非NA相邻的元素(按'ind'分组)中,序列列,然后NA对由“ n”分组的元素进行summarise“ ind”和“ value”

paste

在另一个library(tidyverse) fn1 <- function(lst) { mx <- max(lengths(lst)) map(lst, `length<-`, mx) %>% stack %>% fill(values) %>% group_by(ind) %>% mutate(n = row_number()) %>% group_by(n) %>% summarise(val = paste(ind, "=", values, collapse= "&", sep="")) } fn1(paramlist2) # A tibble: 2 x 2 # n val # <int> <chr> #1 1 a=1&b=2&c=3&d=5 #2 2 a=1&b=2&c=4&d=6 上,每个元素1、2和3具有不同的list

length

在这里,我们假设最后一个非NA元素会重复自身以调整长度

答案 2 :(得分:1)

这是另一种选择。看起来当您将列表转换为数据框时,它会为您填充额外的数字。然后我们只收集结果并汇总输出。

library(tidyverse)

paramlist2 <- list(
  a = "1",
  b = "2",
  c = c("3", "4"),
  d = c("5", "6")
)

paramlist2 %>% 
  as.data.frame() %>% 
  rownames_to_column("row") %>%
  gather(col, num, -row) %>%
  group_by(row) %>%
  summarise(result = paste(col, "=", num, sep = "", collapse = "&"))

#> # A tibble: 2 x 2
#>   row   result         
#>   <chr> <chr>          
#> 1 1     a=1&b=2&c=3&d=5
#> 2 2     a=1&b=2&c=4&d=6

reprex package(v0.2.0)于2018-09-20创建。