R 确定汽车和非汽车模式之间最多1小时的时差
我有 我想找一个专栏,看看在每个家庭中,非汽车模式是否最多比汽车模式早1个小时 我需要该列作为一个人或多个人的索引,这些人在这个时间段与另一个人相交 在上面的示例“第一家庭”中,第一人称的时间比第四人称早1小时,因此在新列中,第一人称的婴儿为4,第四人称的婴儿为1。 输出:R 确定汽车和非汽车模式之间最多1小时的时差,r,dataframe,R,Dataframe,我有 我想找一个专栏,看看在每个家庭中,非汽车模式是否最多比汽车模式早1个小时 我需要该列作为一个人或多个人的索引,这些人在这个时间段与另一个人相交 在上面的示例“第一家庭”中,第一人称的时间比第四人称早1小时,因此在新列中,第一人称的婴儿为4,第四人称的婴儿为1。 输出: 与其他家庭成员的交集不为0或类似NA的任何东西这里有一个生成这些匹配项的dplyr方法 household person time mode overlap
与其他家庭成员的交集不为0或类似NA的任何东西这里有一个生成这些匹配项的
dplyr
方法
household person time mode overlap
1 1 07:45:00 non-car 4
1 1 09:05:00 car 2
1 2 08:10:00 non-car 4,1
1 3 22:45:00 non-car 0
1 4 08:30:00 car 1,2
1 5 22:00:00 car 0
2 1 07:45:00 non-car 0
2 2 16:45:00 car 0
库(dplyr);图书馆(hms)
df%>%
#将桌子连接到自己,按家庭连接。
#因此,每一行都链接到每一行(包括它本身)
#同一个家庭。带有end.x和
#连接的数据将以.y结尾,因此我们可以在下面进行比较。
左联合(df,by=c(“家庭”))%>%
#找出时间差,以秒为单位
突变(time_dif=abs(time.y-time.x))%>%
过滤器(时间差<3600,#如果百分比保持#如果不同模式保持
#我们现在有了答案,下面的所有内容都是用于格式化的
#重命名并隐藏一些我们不再需要的变量
选择(家庭,人=人.x,时间=时间.x,
模式=模式x,其他=个人y)%>%
#将每个人的重叠部分合并为一行
按(家庭、个人、时间)分组%>%
总结(重叠=粘贴(其他,折叠=“,”),时间=长度(其他))%>%
#添加回所有原始行,即使没有重叠
右联合(df)%>%
解组()
##一个tibble:7x6
#家庭人时重叠时间模式
#
#11 07:45 4 1非汽车
#21109:05 21辆车
#3 1 2 08:10 1,4 2非汽车
#4 1 3 22:45不适用不适用非汽车
#5 1 4 08:30 1,2 2车厢
#6 2 1 07:45不适用非汽车
#7216:45北美汽车
这里有一个生成这些匹配的dplyr
方法
household person time mode overlap
1 1 07:45:00 non-car 4
1 1 09:05:00 car 2
1 2 08:10:00 non-car 4,1
1 3 22:45:00 non-car 0
1 4 08:30:00 car 1,2
1 5 22:00:00 car 0
2 1 07:45:00 non-car 0
2 2 16:45:00 car 0
library(dplyr);library(hms)
df%>%
#将桌子连接到自己,按家庭连接。
#因此,每一行都链接到每一行(包括它本身)
#同一住户。原始数据带有end.x和
#连接的数据将以.y结尾,因此我们可以在下面进行比较。
左联合(df,by=c(“家庭”))%>%
#找出时间差,以秒为单位
突变(time_dif=abs(time.y-time.x))%>%
过滤器(时间差<3600,#如果百分比保持#如果不同模式保持
#我们现在有了答案,下面的所有内容都是用于格式化的
#重命名并隐藏一些我们不再需要的变量
选择(家庭,人=人.x,时间=时间.x,
模式=模式x,其他=个人y)%>%
#将每个人的重叠部分合并为一行
按(家庭、个人、时间)分组%>%
总结(重叠=粘贴(其他,折叠=“,”),时间=长度(其他))%>%
#添加回所有原始行,即使没有重叠
右联合(df)%>%
解组()
##一个tibble:7x6
#家庭人时重叠时间模式
#
#11 07:45 4 1非汽车
#21109:05 21辆车
#3 1 2 08:10 1,4 2非汽车
#4 1 3 22:45不适用不适用非汽车
#5 1 4 08:30 1,2 2车厢
#6 2 1 07:45不适用非汽车
#7216:45北美汽车
这看起来几乎是一样的,但它是不同的,这里我们没有时间间隔,只是比较了启动时间,并将非车载模式与每种模式下的车载模式进行了比较household@G.Grothendieck你能帮我解决这个问题吗?我已经花了很多时间,但没能让它发生变化。我认为这其实是一样的,除了上面的定义美联社。这看起来几乎是一样的,因为它是不同的,在这里我们没有时间间隔,只是开始时间比较,非汽车模式比较与汽车模式在每个household@G.Grothendieck你能帮我解决这个问题吗?我已经花了很多时间,但没能做到。我认为除了重叠的定义外,这是真的一样在我的模型中使用了此解决方案,但正如我在问题中提到的,我希望非汽车模式在模式汽车之前1小时。使用您的解决方案,我可以同时获得这两种模式。您可以修复它吗?我不确定我是否遵循。您希望输出与您描述的输出不同吗?不,在本例中,我没有这种情况。因此输出是正确的。让我编辑我的示例确定我添加了对于第一个家庭,第五个人和第三个人之间的差异小于1,但非汽车模式的时间更大。基本上,如果汽车模式的时间小于非汽车模式的时间,您可以删除输出吗?我在我的模型中使用了此解决方案,但正如我在问题中提到的,我希望非汽车模式的时间比汽车模式的时间早1小时我两个都懂。你能修好吗?我不确定我是否懂。你想要不同于你描述的输出吗?不,在这个例子中,我没有那样的输出。所以输出是正确的。让我编辑我的示例好吧,我将第五个人添加到第一个家庭中,现在第三和第五个人之间的差异小于1,但非汽车模式的时间更长基本上,如果汽车模式的时间小于非汽车模式,您可以删除输出吗?
library(dplyr); library(hms)
df %>%
# Connect the table to itself, linking by household.
# So every row gets linked to every row (including itself)
# with the same household. The original data with end .x and
# the joined data will end .y, so we can compare then below.
left_join(df, by = c("household")) %>%
# Find the difference in time, in seconds
mutate(time_dif = abs(time.y - time.x)) %>%
filter(time_dif < 3600, # Keep if <1hr difference
person.x != person.y, # Keep if different person
mode.x != mode.y) %>% # Keep if different mode
# We have the answers now, everything below is for formatting
# Rename and hide some variables we don't need any more
select(household, person = person.x, time = time.x,
mode = mode.x, other = person.y) %>%
# Combine each person's overlaps into one row
group_by(household, person, time) %>%
summarise(overlaps = paste(other, collapse =","), times = length(other)) %>%
# Add back all original rows, even if no overlaps
right_join(df) %>%
ungroup()
## A tibble: 7 x 6
# household person time overlaps times mode
# <int> <int> <time> <chr> <int> <chr>
#1 1 1 07:45 4 1 non-car
#2 1 1 09:05 2 1 car
#3 1 2 08:10 1,4 2 non-car
#4 1 3 22:45 NA NA non-car
#5 1 4 08:30 1,2 2 car
#6 2 1 07:45 NA NA non-car
#7 2 2 16:45 NA NA car