3

我的数据框df中有一个字符串变量tours ,它代表一个人在旅途中所做的不同停靠点。

例如:
1. home_work_leisure_home
2. home_work_shopping_work_home
3. home_work_leisure_errand_home

在交通规划中,我们将活动分为主要活动(工作和教育)和次要活动(其他所有活动)。我想计算第一次主要活动之前的次要活动的数量,在每次旅行的最后一次主要活动之后的两次主要活动之间。

这意味着我正在寻找 R 中的一个函数
:标识字符串变量
b 中的第一个工作。然后计算第一个工作活动之前的活动数量
c. 如果有多个
d,则标识字符串中的最后一个作品。如果有然后计算两个工作活动之间的活动数量,
例如。然后统计上次工作活动后的活动次数

三个示例游览的结果将是:

  1. 第一次小学之前的活动数量:1(家庭)
    第一次和最后一次小学之间的活动数量:0
    最后一次小学之后的活动数量:2(休闲和家庭)
    小学活动的数量:1(工作)
  2. 第一次小学之前的活动数量:1(家)
    第一次和最后一次小学之间的活动数量:1(购物)
    最后一次小学之后的活动数量:1(家)
    小学活动的数量:2(工作)
  3. 第一次小学前的活动数:1(家)
    第一次和最后一次小学之间的活动数:0
    最后一次小学后的活动数:3(休闲、跑腿和回家)
    小学活动的次数:1(工作)

如果有人能帮我解决这个问题,我将非常感激 - 即使它是一个类似问题的链接。

保护你。亲切的问候娜塔莉

4

1 回答 1

1

这应该让你开始;你可以用你想要的任何东西来代替“工作”和“教育”:

> x
[1] "home_work_leisure_home"        "home_work_shopping_work_home"  "home_work_leisure_errand_home"
> strsplit(x,"_")
[[1]]
[1] "home"    "work"    "leisure" "home"   

[[2]]
[1] "home"     "work"     "shopping" "work"     "home"    

[[3]]
[1] "home"    "work"    "leisure" "errand"  "home"   

ad_last_p<-bet_f_l_p<-be_first_p<-prim_n<-numeric()

for(i in 1:length(x)){
  y<-sort(c(which(x[[i]]=="education"),which(x[[i]]=="work"))) ### In each of the examples, find which ones are Primary.
  prim_n[i]<-length(y) ### Number of Primary activities
  be_first_p[i]<-ifelse(y[1]>1,y[1]-1,0) ### Number before First Primary
  bet_f_l_p[i]<-ifelse(length(y)>1,sum(diff(y))-length(y)+1,0) ### Between Primary 1 and 2.
  ad_last_p[i]<-length(x[[i]])-y[length(y)] ### Number after last primary
}

> z<-cbind(be_first_p,bet_f_l_p,af_last_p,prim_n)
> z
     be_first_p bet_f_l_p af_last_p prim_n
[1,]          1         0         2      1
[2,]          1         1         1      2
[3,]          1         0         3      1

希望你想要这样简单的东西?:) 如果您需要任何澄清,请告诉我!

######## 编辑 1 ########

我用 10,000 个示例的列表进行了尝试,大约花了 0.5 秒。似乎还可以。O(n) 最差。如果活动不包括任何工作或教育,您可以在循环的第二行添加:

if(length(y)==0){next}.

这将确保代码在没有记录主要记录时有效,并且这些情况的输出将为“NA”。您可以使用以下方法摆脱那些愚蠢的 NA 结果:

z<-z%>%na.omit
于 2018-04-16T13:17:46.137 回答