pivot_longer() и объединить два набора данных

#r #tidyverse

Вопрос:

У меня есть два набора данных. Первое-это

 issue_1_t1 lt;- c(10, 20, 30, 40) issue_2_t1 lt;- c(10, 20, 30, 10) issue_1_t2 lt;- c(10, 20, 30, 40) issue_2_t2 lt;- c(10, 20, 30, 10) issue_1_t3 lt;- c(10, 20, 30, 40) issue_2_t3 lt;- c(10, 20, 30, 10) area lt;- c(area1, area2, area3, area4) area2 lt;- c(area10, area20, area30, area40) df lt;- data.frame(issue_1_t1, issue_2_t1, issue_1_t2, issue_2_t2, issue_1_t3, issue_2_t3)  

Я хочу перенастроить их таким образом, чтобы они образовывали следующее:

 area area2 issue1 issue2 area1 area10 10 10 area2 area20 20 20 area3 area30 30 30 area4 area40 40 40 area1 area10 10 10 area2 area20 20 20 area3 area30 30 30 area4 area40 40 40 area1 area10 10 10 area2 area20 20 20 area3 area30 30 30 area4 area40 40 40  

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

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

1. ваш пример не работает (пока). Являются ли значения в area кавычках и area2 должны ли они быть (символьными) значениями?

Ответ №1:

Вы можете попробовать

 library(dplyr) library(reshape2) library(tidyr)  df %gt;%  melt %gt;%  mutate(time = str_sub(variable, -1),  issue = paste0("issue", str_split(variable, "_", simplify = T)[,2])) %gt;%  select(time, issue, value) %gt;%  group_by(issue) %gt;%  arrange(issue) %gt;%  mutate(n = 1, n = cumsum(n)) %gt;%  pivot_wider(values_from = value, names_from = issue) %gt;%  mutate(area = rep(area, max(n)/length(area)), area2 = rep(area2, max(n)/length(area2))) %gt;%  select(-time, -n)   issue1 issue2 area area2   lt;dblgt; lt;dblgt; lt;chrgt; lt;chrgt;   1 10 10 area1 area10  2 20 20 area2 area20  3 30 30 area3 area30  4 40 10 area4 area40  5 10 10 area1 area10  6 20 20 area2 area20  7 30 30 area3 area30  8 40 10 area4 area40  9 10 10 area1 area10 10 20 20 area2 area20 11 30 30 area3 area30 12 40 10 area4 area40  

Ответ №2:

Я думаю, что общие данные являются неполными из-за синтаксических ошибок. Я не понимаю, что вы подразумеваете под двумя наборами данных (когда есть только один df ), но я думаю, что у вас есть что-то вроде этого —

 issue_1_t1 lt;- c(10, 20, 30, 40) issue_2_t1 lt;- c(10, 20, 30, 10) issue_1_t2 lt;- c(10, 20, 30, 40) issue_2_t2 lt;- c(10, 20, 30, 10) issue_1_t3 lt;- c(10, 20, 30, 40) issue_2_t3 lt;- c(10, 20, 30, 10) area lt;- c("area1", "area2", "area3", "area4") area2 lt;- c("area10", "area20", "area30", "area40") df lt;- data.frame(area, area2, issue_1_t1, issue_2_t1, issue_1_t2,   issue_2_t2, issue_1_t3, issue_2_t3) df  # area area2 issue_1_t1 issue_2_t1 issue_1_t2 issue_2_t2 issue_1_t3 issue_2_t3 #1 area1 area10 10 10 10 10 10 10 #2 area2 area20 20 20 20 20 20 20 #3 area3 area30 30 30 30 30 30 30 #4 area4 area40 40 10 40 10 40 10  

Вы можете использовать pivot_longer from tidyr , чтобы привести его в нужную форму.

 tidyr::pivot_longer(df,   cols = starts_with('issue'),   names_to = '.value',   names_pattern = '(issue_\d )')  # area area2 issue_1 issue_2 # lt;chrgt; lt;chrgt; lt;dblgt; lt;dblgt; # 1 area1 area10 10 10 # 2 area1 area10 10 10 # 3 area1 area10 10 10 # 4 area2 area20 20 20 # 5 area2 area20 20 20 # 6 area2 area20 20 20 # 7 area3 area30 30 30 # 8 area3 area30 30 30 # 9 area3 area30 30 30 #10 area4 area40 40 10 #11 area4 area40 40 10 #12 area4 area40 40 10