2016-08-21 6 views
0

У меня есть кадр данных, который структурирован как этот:долго широкий с dplyr

dd <- data.frame(round = c("round1", "round2", "round1", "round2"), 
       var1 = c(22, 11, 22, 11), 
       var2 = c(33, 44, 33, 44), 
       nam = c("foo", "foo", "bar", "bar"), 
       val = runif(4)) 

    round var1 var2 nam  val 
1 round1 22 33 foo 0.32995729 
2 round2 11 44 foo 0.89215038 
3 round1 22 33 bar 0.09213526 
4 round2 11 44 bar 0.82644723 

из этого я хотел бы получить кадр данных с двумя линиями, по одному для каждого значения nam и переменных var1_round1, var1_round2, var2_round1, var2_round2, val_round1, val_round2. Я бы действительно хотел бы найти решение dplyr.

nam var1_round1 var1_round2 var2_round1 var2_round2 val_round1 val_round2 
1 foo   22   11   33   44 0.32995729 0.8921504 
2 bar   22   11   33   44 0.09213526 0.8264472 

Ближайшее, что я могу думать о том, чтобы использовать spread() в каком-то творческом пути, но я не могу показаться, чтобы выяснить это.

ответ

4

Для этого можно использовать tidyr/dplyr. We gather набор данных в «длинный» формат, unite «переменная» и «круг» для создания «var», а затем spread в «широком» формате.

library(dplyr) 
library(tidyr) 
gather(dd, variable, value, var1, var2, val) %>% 
     unite(var, variable, round) %>% 
     spread(var, value) 
# nam val_round1 val_round2 var1_round1 var1_round2 var2_round1 var2_round2 
#1 bar 0.7187271 0.6022287   22   11   33   44 
#2 foo 0.2672339 0.7199101   22   11   33   44 

ПРИМЕЧАНИЕ: «Вал» различны, как ОП не ставил seed для runif