Найдите длину прогона 1 в столбце № 1,3,5 и найдите число непрерывных двух 1 в столбце 2,4,6. Данные находятся в кадре данных R - PullRequest
0 голосов
/ 21 февраля 2019

У меня есть данные в виде фрейма данных в R:

> qa
   A_1 A_2 B_1 B_2 C_1 C_2
1    1   1   1   1   1   1
2    1   1   1   1   1   1
3    1   0   1   0   1   1
4    1   1   1   0   1   1
5    1   1   1   1   1   0
6    0   0   1   1   1   1
7    0   0   1   1   1   1
8    0   1   1   0   0   0
9    1   1   1   0   0   0
10   1   1   1   1   0   1

Пожалуйста, предложите наилучший способ достижения следующего результата.

> qc
  A_1 A_2 B_1 B_2 C_1 C_2
1   5   2  10   2   7   2

В приведенном выше фрейме данных:
A_1 = 5 (Максимальное количество прогонов в qa$A_1),
A_2 = 2 (имеется два непрерывных 1 в отношении A_1 = 5),
B_1 = 10 (Максимальное количество прогонов в qa$B_1),
B_2 = 2 (есть два непрерывных 1 в отношении B_1 = 10),
C_1 = 7 (Максимальное количество прогонов в qa$C_1),
C_2 = 2 (есть тринепрерывный 1 по отношению к C_1 = 7)

1 Ответ

0 голосов
/ 21 февраля 2019

Ввод:

qa <- data.frame(A_1 = c(1,1,1,1,1,0,0,0,1,1),
                 A_2 = c(1,1,0,1,1,0,0,1,1,1),
                 B_1 = rep(1,10),
                 B_2 = c(1,1,0,0,1,1,1,0,0,1),
                 C_1 = c(rep(1,7),0,0,0),
                 C_2 = c(1,1,1,1,0,1,1,0,0,1))

rle дает кодирование длины серии, поэтому мы можем использовать его для извлечения первого непрерывного отрезка серий.

База R

sapply(qa, function(x) with (rle(x), lengths[values == 1][1]))

вывод:

A_1 A_2 B_1 B_2 C_1 C_2 
  5   2  10   2   7   4 

или, если вы предпочитаете tidyverse пакет:

library(tidyverse)
map_dfr(qa, ~rle(.)$lengths[rle(.)$values==1][1])

вывод:

# A tibble: 1 x 6
    A_1   A_2   B_1   B_2   C_1   C_2
  <int> <int> <int> <int> <int> <int>
1     5     2    10     2     7     4

или если вы хотитеdata.frame вместо tibble вы можете преобразовать его:

>as.data.frame(map_dfr(qa, ~rle(.)$lengths[rle(.)$values==1][1]))
    A_1 A_2 B_1 B_2 C_1 C_2
1   5   2  10   2   7   4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...