Как разбить массив данных на значения и использовать rle на чанках? - PullRequest
0 голосов
/ 25 декабря 2018

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

Я могу легко разбить столбец целых чисел, используя split, однако это, по-видимому, несовместимо с rle (предположительно, bc split создает список).Я искал решения и / или альтернативы, но ничего не придумал.

Примеры результатов

scores <- c(1, 1, 2, 2, 1, 1, 2, 1, 1, 1, 1, 2, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 1, 1, 1, 1, 1, 1)

Разделить их

g <- seq_along(scores)

scores.div <- split(scores, ceiling(g/7))

Пример того, что я пробовал, но не сработало

Scores.rle <- sapply(scores.div, function(x) {
  r <- rle(x)
  sum(r$values == 1)
})

I 'я ожидаю некоторый результат как это:

2 2 0 1 1

Любая помощь очень ценится

Ответы [ 3 ]

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

Я запускаю ваш код, и ваш код работает хорошо.

> scores <- c(1, 1, 2, 2, 1, 1, 2, 1, 1, 1, 1, 2, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 1, 1, 1, 1, 1, 1)
> g <- seq_along(scores)
> scores.div <- split(scores, ceiling(g/7))
> Scores.rle <- sapply(scores.div, function(x) {
+   r <- rle(x)
+   sum(r$values == 1)
+ })
> Scores.rle
1 2 3 4 5 
2 2 0 1 1

и мой сеанс:

> sessionInfo()
R version 3.5.1 (2018-07-02)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows >= 8 x64 (build 9200)

Matrix products: default

locale:
[1] LC_COLLATE=Chinese (Simplified)_China.936  LC_CTYPE=Chinese (Simplified)_China.936   
[3] LC_MONETARY=Chinese (Simplified)_China.936 LC_NUMERIC=C                              
[5] LC_TIME=Chinese (Simplified)_China.936    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

loaded via a namespace (and not attached):
[1] compiler_3.5.1 tools_3.5.1   
0 голосов
/ 25 декабря 2018

Как объяснено в документах , sapply возвращает именованный вектор в соответствии с именами для списка, созданного lapply:

sapply является пользователем-дружественная версия и оболочка lapply по умолчанию, возвращающая вектор, матрицу или, если simplify = "array", массив, если необходимо, путем применения simplify2array().sapply(x, f, simplify = FALSE, USE.NAMES = FALSE) - это то же самое, что и lapply(x, f)

, просто unname (см. Его документы ), и все готово:

> scores <- c(1, 1, 2, 2, 1, 1, 2, 1, 1, 1, 1, 2, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 1, 1, 1, 1, 1, 1)
> g <- seq_along(scores)
> scores.div <- split(scores, ceiling(g/7))
> unname(sapply(scores.div, function(x) sum(rle(x)$values ==1)))
[1] 2 2 0 1 1
0 голосов
/ 25 декабря 2018

Мы могли бы также использовать tapply

as.vector(tapply(scores, ceiling(g/7), FUN = function(x) sum(rle(x)$values == 1)))
#[1] 2 2 0 1 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...