#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)
. Предупреждение приходит из-за того, что вы передаете два элемента :
, которые жалуются, затем продвигаетесь вперед, используя первый элемент.