You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在R中统计行程字符串各阶段的次级活动数量

嘿,这个交通规划里的活动统计需求我熟!咱们用R一步步来实现,轻松搞定三类次级活动的计数:

首先先明确规则:

  • 初级活动:work、education
  • 次级活动:除上述两类之外的所有活动(比如home、leisure、shopping、errand等)
  • 要统计三个维度:
    1. 首次初级活动之前的次级活动数量
    2. 两次初级活动之间的次级活动总数(如果有多个初级活动的话)
    3. 最后一次初级活动之后的次级活动数量

接下来用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 04:12:06