#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