【问题标题】:Using sets of variables to create another set of variables, or why not?使用一组变量来创建另一组变量,或者为什么不呢?
【发布时间】:2018-02-17 02:09:33
【问题描述】:

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

【问题讨论】:

    标签: r for-loop dynamic-variables


    【解决方案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
    

    不需要循环!

    【讨论】:

    • 谢谢伊斯塔。所以基本上你说的是我应该将数据集从宽转换为长,这更好,因为它更容易操作。然后,我想,当我运行回归时,我会将它转换回一个广泛的数据集。我想我没有看到这比仅仅创建 Z1-Z5 更好,而不是一个多步骤的过程来转换成一个长的,操纵,然后回到一个宽的。
    • 我的意思是,作为一般规则,您应该将数据保持为长格式,仅在需要时才转换为宽格式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-08
    • 1970-01-01
    • 2022-08-04
    • 1970-01-01
    • 2019-11-09
    • 1970-01-01
    • 2018-10-20
    相关资源
    最近更新 更多