Отфильтруйте кадр данных по самой длинной последовательности повторяющихся чисел по строке в r - PullRequest
0 голосов
/ 08 июня 2018

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

ОБРАЗЦЫ ДАННЫХ:

    a<- c(1,0,1,1,1,1,0,0)
    b<- c(0,0,0,1,1,1,0,1)
    c<- c(0,0,1,1,0,0,0,1)
    d<- c(1,0,0,1,1,1,1,0)
    e<- c(1,0,0,1,0,0,1,1)
    f<- c(0,0,0,1,1,1,0,1)
    g<- c(0,0,1,1,0,0,0,1)
    test.data <- data.frame(cbind(a,b,c,d,e,f,g))

    # > test.data
    #   a b c d e f g
    # 1 1 0 0 1 1 0 0
    # 2 0 0 0 0 0 0 0
    # 3 1 0 1 0 0 0 1
    # 4 1 1 1 1 1 1 1
    # 5 1 1 0 1 0 1 0
    # 6 1 1 0 1 0 1 0
    # 7 0 0 0 1 1 0 0
    # 8 0 1 1 0 1 1 1

ОБРАЗЕЦ КОДА ДЛЯ ПОПЫТКИ РЕШЕНИЯ:

result <- data.frame(lapply(test.data, function(x) {
  r <- rle(x)
  r$values[r$lengths!=max(r$lengths)]==1
  r2=inverse.rle(r)
  r2
}))

РЕЗУЛЬТАТ Я ПОЛУЧАЮ (похоже на точную копию того, что вошло?):

# > result
#    a b c d e f g
# 1  1 0 0 1 1 0 0
# 2  0 0 0 0 0 0 0
# 3  1 0 1 0 0 0 1
# 4  1 1 1 1 1 1 1
# 5  1 1 0 1 0 1 0
# 6  1 1 0 1 0 1 0
# 7  0 0 0 1 1 0 0
# 8  0 1 1 0 1 1 1

ЭТО РЕЗУЛЬТАТ, КОТОРЫЙ Я ХОЧУ ПОЛУЧИТЬ (T / F можно использовать вместо 1 и 0, если проще):

# > result
#    a b c d e f g
# 1  0 0 0 1 1 0 0
# 2  0 0 0 0 0 0 0
# 3  0 0 0 0 0 0 0
# 4  1 1 1 1 1 1 1
# 5  1 1 0 0 0 0 0
# 6  1 1 0 0 0 0 0
# 7  0 0 0 1 1 0 0
# 8  0 0 0 0 1 1 1

ПОЖАЛУЙСТА, СОВЕТУЙТЕ!

Ответы [ 2 ]

0 голосов
/ 08 июня 2018
library(magrittr)

val <- 1

test.data %>% 
    apply(1, function(x){
      rle(x) %$% { 
        if(all(values != val)) rep(0, length(x))
        else {
          m      <- max(lengths[values == val]) 
          # Get only longest sequences
          values <- (lengths == m & values == val)*values*(m > 1)
          # Get only one of them
          values[seq_along(values) != which(values == val)[1]] <- 0
          rep(values, lengths)
        }
    }}) %>% t

#      [,1] [,2] [,3] [,4] [,5] [,6] [,7]
# [1,]    0    0    0    1    1    0    0
# [2,]    0    0    0    0    0    0    0
# [3,]    0    0    0    0    0    0    0
# [4,]    1    1    1    1    1    1    1
# [5,]    1    1    0    0    0    0    0
# [6,]    1    1    0    0    0    0    0
# [7,]    0    0    0    1    1    0    0
# [8,]    0    0    0    0    1    1    1
0 голосов
/ 08 июня 2018

Я думаю, что вы после ...

test.data[] <- t(apply(test.data,1,function(x) {y<-rle(x)
           y$values[y$lengths==1] <- 0
           y$values[y$lengths!=max(y$lengths[y$values==1])] <- 0
           return(inverse.rle(y))}))

test.data
  a b c d e f g
1 0 0 0 1 1 0 0
2 0 0 0 0 0 0 0
3 0 0 0 0 0 0 0
4 1 1 1 1 1 1 1
5 1 1 0 0 0 0 0
6 1 1 0 0 0 0 0
7 0 0 0 1 1 0 0
8 0 0 0 0 1 1 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...