Вставить элементы в список, где некоторые элементы содержат вектор - PullRequest
0 голосов
/ 20 сентября 2018

Я пытаюсь создать запрос для 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=5 и a=1&b=2&c=4&d=6

Возможно, мой подход к созданию этого списка параметров не самый лучший.Спасибо

Ответы [ 3 ]

0 голосов
/ 20 сентября 2018

Мы проверяем lengths из list, получаем длину max ('mx'), основываясь на том, что добавляем paramlist2 элементы, которые имеют меньшую длину, с NA, stack кдва столбца data.frame, fill NA элементов с соседними элементами, не являющимися NA, сгруппированными по «ind», создают столбец последовательности, а затем summarise «ind» и «value» по paste с элементами, сгруппированными по 'n'

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

На другом list с разными length каждого элемента 1, 2 и 3.

paramlist3 <- list(a = "1", b = "2", c = c("3", "4", "6"), d = c("5", "6"))
fn1(paramlist3)
# A tibble: 3 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
#3     3 a=1&b=2&c=6&d=6

Здесь,мы предполагаем, что последний не-NA элемент повторяется, чтобы отрегулировать длину

0 голосов
/ 20 сентября 2018

Вот еще один вариант.Похоже, когда вы преобразуете список в информационный фрейм, он заполняет дополнительные цифры для вас.Затем мы просто собираем результаты и суммируем выходные данные.

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

Создано в 2018-09-20 пакетом prex (v0.2.0).

0 голосов
/ 20 сентября 2018

Вам нужно повторить, чтобы более короткие векторы были такой же длины, как и более длинные векторы.Один из способов сделать это - преобразовать список в data.frame, тогда вы можете apply вашу paste функцию для каждой строки:

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

apply(as.data.frame(paramlist2), 1, myfun)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...