Автоматизировать обнаружение начального и конечного ряда фраз - PullRequest
0 голосов
/ 23 октября 2018

У меня есть такой фрейм данных:

df = data.frame(main_name = c("google","yahoo","google","amazon","yahoo","google"),
                volume = c(32,43,412,45,12,54))

Я бы хотел отсортировать его в соответствии с main_name, пример

Стремление узнать, из какой строки в начале есть конкретная фраза, до которойодин для того, чтобы использовать его в цикле for.

main_name volume
amazon     45
google     32
google     412
google     54
yahoo      43
yahoo      12

В нем есть любое «авто» для создания без необходимости знать конкретную фразу.Просто чтобы проверить, изменилось ли оно, и узнать номер начала и конца строки?

amazon [1]
google [2:4]
yahoo  [5:6]

Ответы [ 3 ]

0 голосов
/ 23 октября 2018

Вот альтернативное решение Base R с использованием rle

with(rle(as.character(df$main_name)), setNames(mapply(
    function(x, y) sprintf("[%s:%s]", x, y),
    cumsum(lengths) - lengths + 1, cumsum(lengths)), values))
# amazon  google   yahoo
#"[1:1]" "[2:4]" "[5:6]"

Пример данных

df <- read.table(text =
"main_name volume
amazon     45
google     32
google     412
google     54
yahoo      43
yahoo      12", header = T)
0 голосов
/ 23 октября 2018

Вот еще одна base R опция

with(df, tapply(seq_along(main_name), main_name, FUN = 
  function(x) do.call(sprintf, c(fmt = "[%d:%d]", as.list(range(x))))))
#  amazon  google   yahoo 
# "[1:1]" "[2:4]" "[5:6]" 
0 голосов
/ 23 октября 2018

С tidyverse:

df%>%
   arrange(main_name)%>%
   mutate(row=row_number())%>%
   group_by(main_name)%>%
   summarise(start=first(row),
             end=last(row))%>%
   mutate(res=glue::glue("[{start}:{end}]"))
# A tibble: 3 x 4
  main_name start   end res  
  <fct>     <int> <int> <chr>
1 amazon        1     1 [1:1]
2 google        2     4 [2:4]
3 yahoo         5     6 [5:6]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...