Использование наборов переменных для создания другого набора переменных, или почему бы и нет?

Мой набор данных содержит переменные, которые измеряют одно и то же в 5 разных точках. Назовем их X1, X2, X3, X4, X5 и Y1, Y2, Y3, Y4, Y5. Именно так устроен набор данных. Я импортирую его как data.table. Я хотел бы сделать из них еще одну переменную: Z1 = X1 * c + Y1.

Я читал, что вы не должны зацикливаться на создании динамических переменных. Итак, вот мой ряд вопросов:

(a) Почему я не должен зацикливаться? Я хотел бы иметь переменные в data.table, чтобы их можно было запускать в регрессии, и мне не нужно указывать каждый элемент списка отдельно. Кажется, я должен зациклить, чтобы создать Z1-Z5, не так ли? Я пытаюсь понять преимущества списка вместо цикла, особенно здесь, где у меня уже есть пронумерованные переменные.

(b) Каков наиболее эффективный способ создания этих переменных? Будь то в список или через цикл. Поскольку мне уже приходится проходить через X1-X5 и Y1-Y5, я уже делаю «неблагоразумный» цикл, верно?


person Vicki    schedule 17.02.2018    source источник


Ответы (1)


В общем, работать с данными, которые включают значения в именах столбцов, сложнее, чем с данными, которые включают только один столбец для каждого измерения. Чтобы сделать это более конкретным, ваше текущее расположение выглядит следующим образом:

exd <- data.frame(matrix(rnorm(5*5*2),
                         nrow = 5,
                         dimnames = list(1:5, c("X1", "X2", "X3", "X4", "X5",
                                                 "Y1", "Y2", "Y3", "Y4", "Y5"))))

Более разумное расположение, как это

library(tidyr)
exd <- data.frame(id = 1:nrow(exd), exd)
exd <- gather(exd, "variable", "value", -id)
exd <- separate(exd, variable, into = c("variable", "time"), sep = 1)
exd <- spread(exd, variable, value)

делает данные намного легче манипулировать. Например, вы можете создать Z следующим образом:

exd <- transform(exd, Z = X * 10 + Y)
exd
##    id time           X          Y           Z
## 1   1    1 -0.60189285  0.5500440  -5.4688845
## 2   1    2 -0.09514745  0.6053707  -0.3461038
## 3   1    3 -0.09736927  0.8009143  -0.1727783
## 4   1    4 -0.73479925 -0.2732481  -7.6212406
## 5   1    5  0.96726726  0.8641525  10.5368251
## 6   2    1 -0.99369859  1.2366758  -8.7003101
## 7   2    2 -0.89594782 -0.5063335  -9.4658118
## 8   2    3  0.21615254  1.1652534   3.3267788
## 9   2    4 -0.13180279 -0.4686998  -1.7867277
## 10  2    5 -0.10828009 -1.1986224  -2.2814233
## 11  3    1  1.02678506  0.1390979  10.4069484
## 12  3    2 -2.07075107 -1.4205655 -22.1280762
## 13  3    3  0.88246516  0.3588557   9.1835074
## 14  3    4  0.31001699  0.7041673   3.8043371
## 15  3    5 -0.69842067  0.6394920  -6.3447147
## 16  4    1  0.75106130  0.4102751   7.9208881
## 17  4    2  0.15012013  0.1279930   1.6291943
## 18  4    3  0.20559750 -0.6085572   1.4474179
## 19  4    4 -1.03968035 -1.1973635 -11.5941670
## 20  4    5 -0.27594517  2.4302267  -0.3292250
## 21  5    1 -1.50916654 -0.5584569 -15.6501223
## 22  5    2 -0.07921171  1.9458512   1.1537341
## 23  5    3 -0.61643584 -0.2022409  -6.3665993
## 24  5    4 -0.18430887  0.8663661  -0.9767226
## 25  5    5  1.11464855 -0.5572155  10.5892700

петли не нужны!

person Ista    schedule 17.02.2018
comment
Спасибо Иста. Итак, в основном вы говорите, что я должен преобразовать набор данных из широкого в длинный, и это лучше, потому что им просто легче манипулировать. И затем, я полагаю, я бы преобразовал его обратно в широкий набор данных, когда я запускал регрессию. Наверное, я не вижу, что это обязательно лучше, чем просто создание Z1-Z5, вместо многоступенчатого процесса, чтобы преобразовать в длинный, манипулировать, а затем обратно в широкий. - person Vicki; 17.02.2018
comment
Я говорю, что вы должны хранить свои данные в длинной форме, как общее правило, конвертируя в широкую форму только при необходимости. - person Ista; 17.02.2018