Считайте слова строки, если они встречаются в определенной позиции в строке в R

У меня есть строковая переменная tour в моем фрейме данных df, которая представляет различные остановки, которые индивид сделал во время путешествия.

Например:
1. home_work_leisure_home
2. home_work_shopping_work_home
3. home_work_leisure_errand_home

В Транспортном планировании мы группируем действия в основном (работа и образование) и вторичные действия (все остальное). Я хочу посчитать количество дополнительных действий до первого основного действия, между двумя основными действиями после последнего основного действия для каждого тура.

Это означает, что я ищу функцию в R, которая:
а. идентифицирует первую работу в строковой переменной,
б. затем подсчитывает количество действий до этого первого рабочего действия
с. затем идентифицирует последнюю работу в строке, если существует более одного
д. если есть, то посчитайте количество действий между двумя рабочими действиями,
е. затем посчитайте количество действий после последнего рабочего действия

Результатом для трех примеров туров будет:

  1. количество занятий до первого основного: 1 (домашний)
    количество действий между первым и последним основным: 0
    количество занятий после последнего основного занятия: 2 (досуг и дом)
    Количество основных видов деятельности: 1 (работа)
  2. количество занятий до первого основного: 1 (домашний)
    количество действий между первым и последним основным: 1 (покупки)
    количество занятий после последнего основного: 1 (домашний)
    Количество основных видов деятельности: 2 (работа)
  3. количество занятий до первого основного: 1 (домашний)
    количество действий между первым и последним основным: 0
    количество занятий после последнего основного: 3 (отдых, командировка и дом)
    Количество основных видов деятельности: 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 ########

Я попробовал это со списком 10000 примеров и заняло около 0,5 секунд. Кажется хорошо O(n) как худшее. Если действия не состоят из какой-либо работы или образования, вы можете добавить это во второй строке цикла:

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

Это обеспечит работу кода, когда первичная запись не записана, и для этих случаев выводом будет "NA". Вы можете избавиться от этих глупых результатов NA, используя:

z<-z%>%na.omit
Другие вопросы по тегам