Цикл для нумерации строк между параметрами в R - PullRequest
0 голосов
/ 09 декабря 2018

Мне нужно пронумеровать шаги в столбце journey между строками "session_start".Я не могу придумать, как написать цикл для этого случая.

df <- data.table(
  page = c("page_1", "page_2", "page_3", "page_1", "page_2", "page_1", "page_2", "page_3"),
  journey = c("session_start", NA, NA, "session_start", NA, "session_start", NA, NA)      
)

Желаемый результат должен быть таким.

df <- data.table(
  page = c("page_1", "page_2", "page_3", "page_1", "page_2", "page_1", "page_2", "page_3"),
  journey = c("session_start", "step_1", "step_2", "session_start", "step_1", "session_start", 
              "step_1", "step_2")

)

Ответы [ 3 ]

0 голосов
/ 09 декабря 2018

Вы можете попробовать это:

df$journey <- ifelse(df$page == "page_1","session_start", gsub(".*_","step_",df$page))

Что дает:

    > df
     page       journey
1: page_1 session_start
2: page_2        step_2
3: page_3        step_3
4: page_1 session_start
5: page_2        step_2
6: page_1 session_start
7: page_2        step_2
8: page_3        step_3
0 голосов
/ 09 декабря 2018

Попробуйте это решение с ave.

i <- df$journey == "session_start"
i[is.na(i)] <- 0L
f <- cumsum(i)
df$journey <- ave(as.character(df$journey), f, FUN = function(s){
  s[is.na(s)] <- paste0("step_", seq_along(s)[-length(s)])
  s
})

Возможно, с пакетом data.table могут быть и другие способы, которые вы используете, но я не свободно владею пакетом.

0 голосов
/ 09 декабря 2018

Это делает то, что вы хотите.Обязательно добавьте stringsAsFactors = F к data.table, в противном случае столбец journey будет обрабатываться неправильно.

for (i in 1:nrow(df)) {
    if (is.na(df$journey[i])) {
        df$journey[i] <- paste('step',step_index,sep='')
        step_index <- step_index + 1
    } else {
        step_index <- 1
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...