我的数据框 df 中有一个字符串变量 tours ,表示个体在旅途中所做的不同停留。
例如:
1. home_work_leisure_home
2. home_work_shopping_work_home
3. home_work_leisure_errand_home
在交通规划中,我们将活动分为小学(工作和教育)和次要活动(其他一切)。我想计算在第一次主要活动之前的次要活动的数量,在每次旅行的最后一次主要活动之后的两个主要活动之间。
这意味着我在R中寻找一个函数:
一个。标识字符串变量中的第一个工作,
湾然后计算在第一次工作活动之前的活动数量
C。如果有多个,则识别字符串中的最后一个作品
d。如果有则计算两个工作活动之间的活动数量,
即然后计算上次工作活动后的活动数量
三个示例游览的结果将是:
如果有人能帮我解决这个问题,我会非常感激 - 即使它是指向类似问题的链接。
坦克你。 亲切的问候娜塔莉
答案 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