Хотите обнаружить> = 8 последовательных элементов, которые не являются NA (то есть is.na () == FALSE) в каждой строке большого набора данных - PullRequest
1 голос
/ 04 февраля 2020

У меня есть 200 наборов данных с размером 5120 * 732. Некоторые элементы - NA.

Теперь в каждой строке, когда они> = N1 (N1 = 8) последовательных элементов, которые не являются NA (то есть is.na () == FALSE), я хотел бы поставить перед ними все с 'D'.

Вот пример с N1 = 3.

df1 <- data.frame(c(1.0,NA,1.1,1.2,1.3),
                  c(2.0,2.1,NA,NA,NA),
                  c(3.0,3.1,3.2,3.3,NA),
                  c(4.0,4.1,4.2,4.3,4.4),
                  c(5.0,NA,5.1,NA,5.2))

Ожидаемый результат должен быть:

df1_expected <- data.frame(c('D1.0',NA,1.1,1.2,1.3),
                           c('D2.0','D2.1',NA,NA,NA),
                           c('D3.0','D3.1','D3.2',3.3,NA),
                           c('D4.0','D4.1','D4.2',4.3,4.4),
                           c('D5.0',NA,'D5.1',NA,5.2))

Вот код, который я изменил из этого поста но это не работает, как ожидалось.

Существует ли эффективный метод проверки 8 последовательных элементов, которые не являются NA (т.е. is.na () == FALSE) в каждом столбце большого набора данных?

Любые советы или подсказки с благодарностью!

Мой код:

append_one <- function(x, N, pref = "D"){
  y <- rep(pref, length(x))
  is.na(y) <- is.na(x)
  r <- rle(y)
  r$values[r$lengths < N] <- ""
  y <- inverse.rle(r)
  paste0(y, x)
}

append_all <- function(X, n, pref = "D"){
  Y <- X
  Y [] <- apply(Y, 1, append_one, N = n, pref = pref)  #where I modified
  Y
}

1 Ответ

0 голосов
/ 05 февраля 2020

Вот одно базовое решение R, которое вы можете попробовать

N1 <- 3
df1_expected <- data.frame(t(apply(df1, 1, function(v) {
  r <- rle(!is.na(v))
  idx <- rep(r$lengths >=N1 & r$values,r$lengths)
  replace(v,which(idx),paste0("D",v[idx]))
})))

таким, что

> df1_expected
    v1   v2   v3   v4   v5
1   D1   D2   D3   D4   D5
2 <NA> D2.1 D3.1 D4.1 <NA>
3  1.1 <NA> D3.2 D4.2 D5.1
4  1.2 <NA>  3.3  4.3 <NA>
5  1.3 <NA> <NA>  4.4  5.2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...