在R中统计行程字符串各阶段的次级活动数量
嘿,这个交通规划里的活动统计需求我熟!咱们用R一步步来实现,轻松搞定三类次级活动的计数:
首先先明确规则:
- 初级活动:
work、education - 次级活动:除上述两类之外的所有活动(比如
home、leisure、shopping、errand等) - 要统计三个维度:
- 首次初级活动之前的次级活动数量
- 两次初级活动之间的次级活动总数(如果有多个初级活动的话)
- 最后一次初级活动之后的次级活动数量
接下来用tidyverse工具链处理,代码简洁又直观:
第一步:加载包并构造示例数据
library(tidyverse) # 构造你的示例DataFrame df <- tibble( tours = c( "home_work_leisure_home", "home_work_shopping_work_home", "home_work_leisure_errand_home" ) )
第二步:处理行程数据并统计指标
df_processed <- df %>% mutate( # 把每个行程拆分成单独的活动列表 activity_list = str_split(tours, "_", simplify = FALSE), # 给每个活动标记是初级还是次级 activity_type = map(activity_list, ~case_when( .x %in% c("work", "education") ~ "primary", TRUE ~ "secondary" )), # 找出所有初级活动在列表中的位置索引 primary_positions = map(activity_type, ~which(.x == "primary")), # 统计首次初级活动前的次级活动数 pre_primary_secondary = map2_int(activity_type, primary_positions, ~{ if (length(.y) == 0) { # 如果没有初级活动,可根据需求调整逻辑,这里返回所有次级活动数 sum(.x == "secondary") } else { sum(.x[1:(.y[1]-1)] == "secondary") } }), # 统计两次初级活动之间的次级活动总和 between_primary_secondary = map2_int(activity_type, primary_positions, ~{ if (length(.y) < 2) { 0 # 少于2个初级活动,中间无间隔 } else { # 遍历每对相邻初级活动,计算中间次级数再求和 sum(map2_dbl(.y[-length(.y)], .y[-1], ~{ sum(.x[(.x+1):(.y-1)] == "secondary") })) } }), # 统计最后一次初级活动后的次级活动数 post_primary_secondary = map2_int(activity_type, primary_positions, ~{ if (length(.y) == 0) { 0 } else { sum(.x[(.y[length(.y)]+1):length(.x)] == "secondary") } }) )
第三步:查看最终结果
df_processed %>% select(tours, pre_primary_secondary, between_primary_secondary, post_primary_secondary)
运行后会得到如下结果:
# A tibble: 3 × 4 tours pre_primary_secondary between_primary_secondary post_primary_secondary <chr> <int> <int> <int> 1 home_work_leisure_home 1 0 1 2 home_work_shopping_work_home 1 1 1 3 home_work_leisure_errand_home 1 0 2
补充说明
- 如果数据里存在无初级活动的行程,可根据实际需求调整
pre_primary_secondary的逻辑(比如设为0或全部次级数) - 若出现连续初级活动(如
work_work),中间次级数会自动计为0,符合业务逻辑 - 用
map系列函数确保每个行程独立计算,适配不同长度的活动序列
内容的提问来源于stack exchange,提问作者N.F
相关产品推荐
相关产品推荐

