如果字符串出现在R中字符串内的某个位置,则对其进行计数

时间:2018-04-16 12:45:02

标签: r string count position string-function

我的数据框 df 中有一个字符串变量 tours ,表示个体在旅途中所做的不同停留。

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

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

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

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

  1. 第一小学前的活动数量:1(家庭)
    第一个和最后一个主要活动之间的活动数量:0
    最后一次小学后的活动数量:2(休闲和家庭)
    主要活动数量:1(工作)
  2. 第一小学前的活动数量:1(家庭)
    第一个和最后一个小学之间的活动数量:1(购物)
    最后一次小学后的活动数量:1(家庭)
    主要活动的数量:2(工作)
  3. 第一小学前的活动数量:1(家庭)
    第一个和最后一个主要活动之间的活动数量:0
    最后一次小学后的活动数量:3(休闲,差事和家庭)
    主要活动数量:1(工作)
  4. 如果有人能帮我解决这个问题,我会非常感激 - 即使它是指向类似问题的链接。

    坦克你。 亲切的问候娜塔莉

1 个答案:

答案 0 :(得分: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