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

如果字符串中的单词出现在R中字符串的某个位置,则对其进行计数,r,string,count,position,string-function,R,String,Count,Position,String Function,我的数据帧df中有一个字符串变量tours,它表示个人在旅途中的不同停留 例如: 1.家庭\工作\休闲\家庭 2.在家工作购物工作在家 3.家\工作\休闲\差事\家 在交通规划中,我们将主要活动(工作和教育)和次要活动(其他所有活动)分组。我想计算第一个主要活动之前的次要活动数量,以及每次巡演最后一个主要活动之后两个主要活动之间的次要活动数量 这意味着我正在R中寻找一个函数: A.标识字符串变量中的第一个工作, B然后统计第一个工作活动之前的活动数 C如果有多个工作,则标识字符串中的最后一个工作

我的数据帧df中有一个字符串变量tours,它表示个人在旅途中的不同停留

例如:
1.家庭\工作\休闲\家庭
2.在家工作购物工作在家
3.家\工作\休闲\差事\家

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

这意味着我正在R中寻找一个函数:
A.标识字符串变量中的第一个工作,
B然后统计第一个工作活动之前的活动数
C如果有多个工作,则标识字符串中的最后一个工作
D如果有,则计算两个工作活动之间的活动数量,
E然后计算最后一个工作活动之后的活动数

三个示例旅行的结果是:

  • 第一小学之前的活动数量:1(家)
    第一个和最后一个主要活动之间的活动数:0
    上次小学毕业后的活动数量:2(休闲与家庭)
    主要活动数量:1(工作)
  • 第一小学之前的活动数量:1(家)
    第一个和最后一个小学之间的活动数量:1(购物)
    上次小学毕业后的活动数量:1(家)
    主要活动数量:2(工作)
  • 第一小学之前的活动数量:1(家)
    第一个和最后一个主要活动之间的活动数:0
    上次小学毕业后的活动数量:3(休闲、差事和回家)
    主要活动数量: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
    
    这将确保代码在未记录主数据时工作,并且这些情况下的输出将为“NA”。您可以使用以下方法消除这些愚蠢的NA结果:

    z<-z%>%na.omit
    
    z%na.省略
    
    出于价值考虑,让R做簿记通常更好(更快、更健壮)——使用
    sapply(strsplit(x,“),…)
    而不是
    For
    循环,并将答案的四个部分的向量作为标量返回(不需要在For循环之外初始化向量),
    c(be_first_p,bet_f_l_p,…)
    ,必要时使用
    t()
    进行转置。另外,如果(…)。。。else…而不是
    ifelse()
    来比较标量值。非常感谢您-答案和注释都非常有用!
    z<-z%>%na.omit