Подсчет количества последовательностей определенного значения для нескольких столбцов в кадре данных - PullRequest
1 голос
/ 31 мая 2019

Я хотел бы создать таблицу или новый фрейм данных, который отображает, для каждого столбца в исходном фрейме данных (из которых их много), сколько раз встречается последовательность определенного значения.Например, если у меня есть следующий фрейм данных:

x <- data.frame("Red" = c("a", "b", "a", "a", "c", "d"), "Blue" = c("b", "a", "a", "a", "a", "a"), "Green" = c("a", "a", "b", "a", "b", "a"))

и я хочу знать, для каждого цвета (красный, синий и зеленый), сколько раз происходит запуск значения «а» (то есть, прежде чем оно прервется другим значением, таким как b или c)

Правильный ответ будет выглядеть примерно так:

     Color a_sequences
1   Red  2
2  Blue  1
3 Green  3

Я нашел решения на этом сайте, используя функцию rle наотдельные векторы, но я не знаю, как масштабировать это для всего фрейма данных с несколькими столбцами и получить новую таблицу или фрейм данных с количеством последовательностей, как в приведенной выше таблице.Спасибо!

Ответы [ 4 ]

1 голос
/ 31 мая 2019

Вот вариант с tidyverse, где мы gather в формате 'long', сгруппированы по 'color' и идентификатору длины серии (rleid) в 'value', filter the ' value 'элементы, которые являются' a ', затем сгруппированы по' color ', получают количество различных элементов' grp '

library(tidyverse)
library(data.table)
gather(x, color, value) %>% 
   group_by(color, grp = rleid(value)) %>% 
   filter(value == "a") %>% 
   group_by(color) %>%
   summarise(n = n_distinct(grp))
# A tibble: 3 x 2
#  color     n
#  <chr> <int>
#1 Blue      1
#2 Green     3
#3 Red       2

Или опция с summarise_all

x %>% 
   summarise_all(list(~ n_distinct(setdiff((. == 'a') * rleid(.), 0)))) %>% 
   as.list %>% 
   enframe %>%
   unnest
# A tibble: 3 x 2
#  name  value
#  <chr> <int>
#1 Red       2
#2 Blue      1
#3 Green     3
1 голос
/ 31 мая 2019

Вот еще одна идея.Мы можем объединить и свернуть всю строку, разбить строку, которая не является a, и посчитать, сколько элементов содержит a.result2 является окончательным результатом.

result <- sapply(x, function(x) {
  x2 <- as.character(x)
  y <- paste0(x2, collapse = "")
  z <- strsplit(y, "[^a]")[[1]]
  return(sum(grepl("a", z)))
})

result2 <- data.frame(Color = names(result), a_sequence = unname(result))
result2
#   Color a_sequence
# 1   Red          2
# 2  Blue          1
# 3 Green          3
1 голос
/ 31 мая 2019
f = function(v, ch) sum(rle(as.character(v))$values == ch)
sapply(x, f, 'a')
# Red  Blue Green 
# 2     1     3 
0 голосов
/ 31 мая 2019

в базе R вы можете сделать:

 f = as.character(unique(unlist(x))) 
 t(sapply(x,function(y)table(factor(rle(as.character(y))$values,f))))
      a b c d
Red   2 1 1 1
Blue  1 1 0 0
Green 3 2 0 0

Кажется, весь ваш набор данных в факторах, поэтому используется код as.character()

...