#r
#r
Вопрос:
предположим, у меня есть эти данные:
yearlt;- c(2000,2000,2000,2001,2001,2001,2002,2002,2002) Hlt;- c(1.5,2.5,3,4.7,5.7,6.5,3.2,2.1,1.9) alt;- c(11:19) blt;- c(21:29) dflt;- data_frame(year,H,a,b) df # A tibble: 9 × 4 year H a b lt;dblgt; lt;dblgt; lt;intgt; lt;intgt; 1 2000 1.5 11 21 2 2000 2.5 12 22 3 2000 3 13 23 4 2001 4.7 14 24 5 2001 5.7 15 25 6 2001 6.5 16 26 7 2002 3.2 17 27 8 2002 2.1 18 28 9 2002 1.9 19 29
в R как я могу повторять H
для каждого года таким образом, чтобы для каждого года группа данных входила a
и b
повторялась. мой ожидаемый результат выглядит следующим образом:
year H a b lt;dblgt; lt;dblgt; lt;dblgt; lt;dblgt; 1 2000 1.5 11 21 2 2000 1.5 12 22 3 2000 1.5 13 23 4 2000 2.5 11 21 5 2000 2.5 12 22 6 2000 2.5 13 23 7 2000 3 11 21 8 2000 3 12 22 9 2000 3 13 23 10 2001 4.7 14 24 11 2001 4.7 15 25 12 2001 4.7 16 26 13 2001 5.7 14 24 14 2001 5.7 15 25 15 2001 5.7 16 26 16 2001 6.5 14 24 17 2001 6.5 15 25 18 2001 6.5 16 26 19 2002 3.2 17 27 20 2002 3.2 18 28 21 2002 3.2 19 29 22 2002 2.1 17 27 23 2002 2.1 18 28 24 2002 2.1 19 29 25 2002 1.9 17 27 26 2002 1.9 18 28 27 2002 1.9 19 29
Ответ №1:
Вы можете использовать tidyr::expand_grid()
, который принимает фреймы данных. В этом случае сгруппируйте по годам, а затем повторите группы с group_modify()
помощью .
library(dplyr) library(tidyr) df %gt;% group_by(year) %gt;% group_modify(~ expand_grid(.x[1], .x[-1])) # A tibble: 27 x 4 # Groups: year [3] year H a b lt;dblgt; lt;dblgt; lt;intgt; lt;intgt; 1 2000 1.5 11 21 2 2000 1.5 12 22 3 2000 1.5 13 23 4 2000 2.5 11 21 5 2000 2.5 12 22 6 2000 2.5 13 23 7 2000 3 11 21 8 2000 3 12 22 9 2000 3 13 23 10 2001 4.7 14 24 # ... with 17 more rows
Или та же идея без использования group_modify()
, которая является экспериментальной функцией:
library(purrr) df %gt;% split(~ year) %gt;% map_df(~ expand_grid(.x[1:2], .x[3:4]))
Ответ №2:
Другое решение:
library(dplyr) yearlt;- c(2000,2000,2000,2001,2001,2001,2002,2002,2002) Hlt;- c(1.5,2.5,3,4.7,5.7,6.5,3.2,2.1,1.9) alt;- c(11:19) blt;- c(21:29) dflt;- data.frame(year,H,a,b) df %gt;% group_by(year) %gt;% summarise(H = rep(H, each = n()), across(-1, ~ rep(.x, n())), .groups = "drop") #gt; # A tibble: 27 × 4 #gt; year H a b #gt; lt;dblgt; lt;dblgt; lt;intgt; lt;intgt; #gt; 1 2000 1.5 11 21 #gt; 2 2000 1.5 12 22 #gt; 3 2000 1.5 13 23 #gt; 4 2000 2.5 11 21 #gt; 5 2000 2.5 12 22 #gt; 6 2000 2.5 13 23 #gt; 7 2000 3 11 21 #gt; 8 2000 3 12 22 #gt; 9 2000 3 13 23 #gt; 10 2001 4.7 14 24 #gt; # … with 17 more rows