删除 R 中行中的后续值

remove subsequent values in row in 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

我想删除后续的 A 值。

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

P.S。可以删除第 5(c5) 列,因为所有 NA 值。
重点是仅删除后续的 'A' 值,不应更改其他后续值(例如,第二行有两个不应删除的 'C')。
我怎样才能在 R 中做到这一点?

遍历行,使用 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>

这就是你想要的吗?

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)

我们假设您输入的是字符值而不是因子。这样我们就不需要 运行 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)

看来您只想删除重复的 A 并移动,最后的位置替换为 NA:

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