Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在R中创建循环列?_R - Fatal编程技术网

如何在R中创建循环列?

如何在R中创建循环列?,r,R,我想创建一个新的列循环,如下所示: Household person trip ZoneOfHome start_zone end_zone 1 1 1 22 22 13 1 1 2 22 13 22 1 1 3 22

我想创建一个新的列循环,如下所示:

Household   person    trip    ZoneOfHome    start_zone   end_zone
   1           1        1      22              22           13
   1           1        2      22              13           22
   1           1        3      22              22           34
   1           1        4      22              34           22 
   1           2        1      22              22           13
   1           2        2      22              13           22
   2           1        1      15              15           15
   2           1        2      15              15           15
   2           1        3      15              15           45
   2           1        4      15              45           15
   3           1        1      17              6            17
   3           1        2      17              17           10
   3           1        3      17              10           17              
第一列是家庭索引。第二列是该家庭的人口指数。第三列是一天中每个家庭每天的出行指数。住宅区是那户人家的住宅区。起始区是一个人从那里开始旅行的区域,而结束区是一个人旅行到那里的地方的区域。 循环是从家开始到家结束的一系列行程。 我想要一个新的栏'loop',它确定家庭成员每次旅行的循环。我在三个不同的家庭中向他们展示了三种不同的情况

1-在上述示例中,第一个家庭的家庭区域为22。第一个人的第一次旅行是从家到13区。然后从13号回家。所以这个人的第一个循环是:

22->13->22

此人的第二个循环是
22->34->22

第二人称的循环是
22->13->22

第二个家庭有点复杂。家的区域是15。第一个人的行程是从15到15。(因此是一个离家近的地方)。这并不意味着15->15是一个循环。 人从15到15,再从15到15,所以循环是

15->15->15>-15

他的第二个循环是
15->45->15

3-在第三个家庭中,第一个人的第一次旅行不是在家。因此,我们删除了第一次旅行,并从一次以家为基础的旅行开始。循环是
17->10->17

Household   person    trip    ZoneOfHome    start_zone   end_zone       loop
   1           1        1      22              22           13            1
   1           1        2      22              13           22            1
   1           1        3      22              22           34            2
   1           1        4      22              34           22            2
   1           2        1      22              22           13            1
   1           2        2      22              13           22            1
   2           1        1      15              15           15            1
   2           1        2      15              15           15            1
   2           1        3      15              15           45            2
   2           1        4      15              45           15            2
   3           1        1      17              6            17            -
   3           1        2      17              17           10            1
   3           1        3      17              10           17            1

这是一个具有挑战性的问题。我找到了一个解决方案,它使用
cumsum()
rowid()
返回给定样本数据集的预期结果

library(data.table)
setDT(DT)[, loop := cumsum((ZoneOfHome == start_zone) - rowid(start_zone, end_zone) + 1L), 
          by = .(Household, person)][]
解释 首先,我们为
家庭中的每个
人员
创建一个运行计数,无论该人员何时离开其家庭区域:

DT[, loop1 := cumsum(ZoneOfHome == start_zone), by = .(Household, person)][]
这与预期的结果非常接近,除了旅行目的地位于母国区域的情况。所以,我们需要对这个案例进行更正。修正基于以下观察结果,即主区域环路的
开始区域
结束区域
在后续行中是相同的。这可以借助于
rowid()
函数进行计数,该函数可在其中一个参数更改时增加计数器:

DT[, corr_local := cumsum(rowid(start_zone, end_zone) - 1L), by = .(Household, person)][]
最后,两个helper列需要合并

DT[, loop := loop1 - corr_local, by = .(Household, person)][]
资料
库(data.table)

DT已经准备好了一个解决方案,但这一个让我感到羞愧。看来,我需要深入研究数据表powerful@Mr.Rlover非常感谢。我在这里使用了
data.table
,因为它是
rowid()
函数,而且我对
data.table
dplyr
更熟悉。然而,我相信这种方法也可以在
dplyr
中实现。@我注意到我的数据集更复杂。你能告诉我,如果我还有一个专栏叫“旅行目的”吗。现在,当
zone=start\u zone时,循环开始,直到
zone=end\u zone`&purpose=home?@elham,请发布一个新问题,并附上适当的样本数据集,包括预期结果。否则,我无法验证我的建议是否正确。谢谢。@Uwe你能看看这个帖子吗?
DT[, corr_local := cumsum(rowid(start_zone, end_zone) - 1L), by = .(Household, person)][]
    Household person trip ZoneOfHome start_zone end_zone loop1 corr_local
 1:         1      1    1         22         22       13     1          0
 2:         1      1    2         22         13       22     1          0
 3:         1      1    3         22         22       34     2          0
 4:         1      1    4         22         34       22     2          0
 5:         1      2    1         22         22       13     1          0
 6:         1      2    2         22         13       22     1          0
 7:         2      1    1         15         15       15     1          0
 8:         2      1    2         15         15       15     2          1
 9:         2      1    3         15         15       45     3          1
10:         2      1    4         15         45       15     3          1
11:         3      1    1         17          6       17     0          0
12:         3      1    2         17         17       10     1          0
13:         3      1    3         17         10       17     1          0
DT[, loop := loop1 - corr_local, by = .(Household, person)][]
    Household person trip ZoneOfHome start_zone end_zone loop1 corr_local loop
 1:         1      1    1         22         22       13     1          0    1
 2:         1      1    2         22         13       22     1          0    1
 3:         1      1    3         22         22       34     2          0    2
 4:         1      1    4         22         34       22     2          0    2
 5:         1      2    1         22         22       13     1          0    1
 6:         1      2    2         22         13       22     1          0    1
 7:         2      1    1         15         15       15     1          0    1
 8:         2      1    2         15         15       15     2          1    1
 9:         2      1    3         15         15       45     3          1    2
10:         2      1    4         15         45       15     3          1    2
11:         3      1    1         17          6       17     0          0    0
12:         3      1    2         17         17       10     1          0    1
13:         3      1    3         17         10       17     1          0    1
library(data.table)
DT <- fread(
"Household   person    trip    ZoneOfHome    start_zone   end_zone
   1           1        1      22              22           13
   1           1        2      22              13           22
   1           1        3      22              22           34
   1           1        4      22              34           22 
   1           2        1      22              22           13
   1           2        2      22              13           22
   2           1        1      15              15           15
   2           1        2      15              15           15
   2           1        3      15              15           45
   2           1        4      15              45           15
   3           1        1      17              6            17
   3           1        2      17              17           10
   3           1        3      17              10           17")