如何在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")