Удалить последующие значения в строке в R

Я хочу удалить определенное повторяющееся значение в каждой строке в кадре данных.
скажем так:

DF (3*5)
#  c1 c2 c3 c4 c5
1  A  A  B  A  NA
2  C  C  A  A  B
3  B  A  A  NA NA

Я хочу удалить последующее значение.

so New_df:
#  c1 c2 c3 c4 c5
1  A  B  A  NA NA
2  C  C  A  B  NA
3  B  A  NA NA NA

PS Колонка 5(c5) может быть удалена, поскольку все значения NA.
Смысл состоит в том, чтобы удалить только последующее значение "A", и другие последующие значения не должны изменяться (например, во втором ряду есть два "C", которые не должны быть удалены).
Как я могу сделать это в R?

3 ответа

Решение

Давайте предположим, что вы ввели их как значения символов, а не как факторы. Таким образом, нам не нужен дополнительный шаг запуска DF[] <- lapply ( . , as.character),

 DF <- read.table(text = "
A  A  B  A  NA
C  C  A  A  B
B  A  A  NA NA", stringsAsFactors=FALSE)

Похоже, вы хотите, чтобы дублированные буквы А были удалены и смещены с заменой позиций в конце на АН:

t( apply(DF, 1, function(x){ xR <- rle(x)
                      xR$lengths[xR$values == "A"] <- 1
                   x <- c( rep( xR$values, xR$lengths), 
                           rep(NA, length(x)-sum(xR$lengths) ) ) }
         )
   )

     [,1] [,2] [,3] [,4] [,5]
[1,] "A"  "B"  "A"  NA   NA  
[2,] "C"  "C"  "A"  "B"  NA  
[3,] "B"  "A"  NA   NA   NA 

Это то, что вы после?

as.data.frame(t(apply(DF, 1, function(x) {
    idx <- which(x == "A");
    x[-idx[c(0, diff(idx) == 1)]];
})))
#  V1 V2   V3   V4
#1  A  B    A <NA>
#2  C  C    A    B
#3  B  A <NA> <NA>

Пример данных

DF <- read.table(text =
    "1  A  A  B  A  NA
2  C  C  A  A  B
3  B  A  A  NA NA", header = F, row.names = 1)

Перебирайте строки, используйте rle и получайте значения:

# example data
DF <- read.table(text = "
A  A  B  A  NA
C  C  A  A  B
B  A  A  NA NA")

data.frame(t(
  apply(DF, 1, function(i){
    res <- rle(i)$values
    length(res) <- length(i)
    res
  })))

# output
#   X1 X2   X3   X4   X5
# 1  A  B    A <NA> <NA>
# 2  C  A    B <NA> <NA>
# 3  B  A <NA> <NA> <NA>
Другие вопросы по тегам