使用变量集来创建另一组变量,或者为什么不变量?

时间:2018-02-17 02:09:33

标签: r for-loop dynamic-variables

我的数据集包含在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,我已经做了#34;不明智的"循环,对吧?

1 个答案:

答案 0 :(得分: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

不需要循环!