Создание tibble и рандомизация

#r #dplyr

#r #dplyr

Вопрос:

Я хочу создать tibble с идентификатором ( iter ) и случайно сгенерированными данными.

    iter data
  <int> <list>
1     1 <dbl [5]>
2     2 <dbl [5]>
3     3 <dbl [5]>
  

Я попробовал два типа кодов, и только один из них дает ожидаемый результат, но я не уверен, почему это так, потому что единственная разница заключается в генерации данных внутри tibble() или нет.

 iter <- 2 ; n <- 5 ; mu <- 1
gen_data <- function(x){  # randomly draw from Exponential function
    return(rexp(n, rate=1/mu))
}

# Works (different values each time)
data <- lapply(1:iter, gen_data)
tibble(iter = 1:iter,
             data = data) %>% unnest(data)

# Doesn't work (  there is a warning)
tibble(iter = 1:iter,
             data = lapply(1:iter, gen_data)) %>% unnest(data)
  

Комментарии:

1. смотрите ?tibble : «tibble() строит столбцы последовательно. При определении столбца вы можете ссылаться на столбцы, созданные ранее в вызове. Перерабатываются только столбцы длиной один.» Во втором примере iter относится к iter столбцу (1:2), который вы только что создали.

Ответ №1:

Когда вы вызываете lapply() во втором примере, который не работает, вам нужно ссылаться iter только на его имя вместо того, чтобы пытаться заново построить вектор.

 tibble(iter = 1:iter,
       data = lapply(iter, gen_data)) %>% unnest(data)
  

Это потому, что tibble() ищет переменные по имени в своем контексте и iter уже существует там как c(1,2) . Предупреждение приходит из-за того, что вы передаете два элемента : , которые жалуются, затем продвигаетесь вперед, используя первый элемент.