«Растягивающие» таблицы в R

#r #datatable #data-manipulation

Вопрос:

У меня есть следующие данные в R:

 name = c("person1", "person2", "person3", "person1", "person2", "person3")
var1 = c(1,3,5,6,7,3)
var2 = c(1,1,1,1,1,1)
var3 = rnorm(6,5,6)
var4 = rnorm(6,1,6)
iteration_round = c(1,1,1,2,2,2)

frame = data.frame(name, var1, var2, var3, var4, iteration_round)

    name var1 var2      var3       var4 iteration_round
1 person1    1    1 21.931815  0.4904012               1
2 person2    3    1 -2.261360 -2.3358434               1
3 person3    5    1  5.493085  5.7269291               1
4 person1    6    1 -5.039148 -9.4483417               2
5 person2    7    1 -3.662336  5.8499795               2
6 person3    3    1  5.297230 -2.8756166               2
 

Я пытаюсь отформатировать данные таким образом, чтобы столбцы выглядели так (столбец «iteration_round» теперь будет иметь только уникальные значения 1,2,3,..) :

 person1_var1 person1_var2 person1_var3 person1_var4 person2_var1 person2_var2, person2_var3, person2_var4 person3_var1 person3_var2, person3_var3, person3_var4  iteration_round
 

Это должно выглядеть примерно так (я просто заполнил случайные числа для примера, но столбец iteration_round правильный):

  person1_var1 person1_var2 person1_var3 person1_var4 person2_var1 person2_var2 person2_var3 person2_var4 person3_var1 person3_var2 person3_var3 person3_var4 iteration_round
1           15            4            5            5            5            5            5            6            4            5           11            6               1
2            5            2            6            6            7            8            9            9            1            0            2            6               2
 

Я попытался сделать это с помощью библиотеки data.table

 library(data.table)

my_table = dcast(setDT(frame),  var1   var2   var3   var4  ~  iteration_round , value.var = 'name')
 

Но это не дает желаемого результата:

  var1 var2      var3       var4       1       2
1:    1    1 21.931815  0.4904012 person1    <NA>
2:    3    1 -2.261360 -2.3358434 person2    <NA>
3:    3    1  5.297230 -2.8756166    <NA> person3
4:    5    1  5.493085  5.7269291 person3    <NA>
5:    6    1 -5.039148 -9.4483417    <NA> person1
6:    7    1 -3.662336  5.8499795    <NA> person2
 

Может кто-нибудь, пожалуйста, показать мне, как это исправить?

Спасибо

Ответ №1:

dcast может содержать несколько столбцов value.var . Создайте формулу с помощью «iteration_round» и «name»

 dcast(setDT(frame), iteration_round ~ name, 
        value.var = c('var1', 'var2', 'var3', 'var4'))
 

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

1. это именно то, что я искал! Спасибо! через несколько минут я могу принять ваш ответ! Я также обновил свой вопрос, чтобы показать пример . Спасибо!