повторяющаяся строка столбца во фрейме данных n такой же длины, как и у другого столбца

#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