Считайте слова строки, если они встречаются в определенной позиции в строке в R
У меня есть строковая переменная tour в моем фрейме данных df, которая представляет различные остановки, которые индивид сделал во время путешествия.
Например:
1. home_work_leisure_home
2. home_work_shopping_work_home
3. home_work_leisure_errand_home
В Транспортном планировании мы группируем действия в основном (работа и образование) и вторичные действия (все остальное). Я хочу посчитать количество дополнительных действий до первого основного действия, между двумя основными действиями после последнего основного действия для каждого тура.
Это означает, что я ищу функцию в R, которая:
а. идентифицирует первую работу в строковой переменной,
б. затем подсчитывает количество действий до этого первого рабочего действия
с. затем идентифицирует последнюю работу в строке, если существует более одного
д. если есть, то посчитайте количество действий между двумя рабочими действиями,
е. затем посчитайте количество действий после последнего рабочего действия
Результатом для трех примеров туров будет:
- количество занятий до первого основного: 1 (домашний)
количество действий между первым и последним основным: 0
количество занятий после последнего основного занятия: 2 (досуг и дом)
Количество основных видов деятельности: 1 (работа) - количество занятий до первого основного: 1 (домашний)
количество действий между первым и последним основным: 1 (покупки)
количество занятий после последнего основного: 1 (домашний)
Количество основных видов деятельности: 2 (работа) - количество занятий до первого основного: 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