Как удалить повторяющиеся значения из разных строк по уникальному идентификатору? - PullRequest
1 голос
/ 30 января 2020

Я только начинаю использовать R. У меня есть набор данных с уникальными идентификаторами в первом столбце (1958 пациентов) и в столбцах 2-35 0 и 1 .

Например:

Patient A:  0 1 0 1 1 1 1 1 1 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 NA NA 

Я хочу изменить это на:

Patient A: 0 1 0 1 0 1

Заранее спасибо.

Ответы [ 2 ]

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

Исходя из вашего примера, неясно, могут ли НС также происходить в середине, и как вы хотели бы справиться с этой ситуацией (например, сделать 1 NA 1 до 1 1 (вариант 1) и, следовательно, объединить два 1, или будет ли NA отмечать границу, и вы сохраните обе единицы (вариант 2). Это определяет, в какой момент удалить NA в коде.

Вы можете использовать S4Vectors кодирование длины выполнения, которое позволяют иметь больше, чем просто 0 и 1.

library(S4Vectors)

## create example data
set.seed(1)
x <- sample(c(0,1), (1958*34), replace=TRUE, prob=c(.4, .6))
x[sample(length(x), 200)] <- NA
x <- matrix(x, nrow=1958, ncol=34)
df <- data.frame(patient.id = paste0("P", seq_len(1958)), x, stringsAsFactors = FALSE)

## define function to remove NA values
# option 1
fun.NA.boundary <- function(x) {
    a <- runValue(Rle(x))
    a[!is.na(a)]
}
# option 2
fun.NA.remove <- function(x) runValue(Rle(x[!is.na(x)]))

## calculate results
# option 1
reslist <- apply(x[,-1], 1, function(y) fun.NA.boundary(y))

# option 2
reslist <- apply(x[,-1], 1, function(y) fun.NA.remove(y))

names(reslist) <- df$patient.id
head(reslist)
#> $P1
#>  [1] 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0
#> 
#> $P2
#>  [1] 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1
#> 
#> $P3
#>  [1] 0 1 0 1 0 1 0 1 0 1 0 1 0 1
#> 
#> $P4
#>  [1] 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1
#> 
#> $P5
#>  [1] 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0
#> 
#> $P6
#>  [1] 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0
0 голосов
/ 30 января 2020

Мы можем использовать tapply и группировать нашу переменную в зависимости от того, меняет ли она значение или нет, т.е.

tapply(x[!is.na(x)], cumsum(c(TRUE, diff(x[!is.na(x)]) != 0)), FUN = unique)

#1 2 3 4 5 6 
#0 1 0 1 0 1 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...