删除R中的行中的后续值

时间:2018-04-18 22:12:46

标签: r row repeat

我想删除数据框中每一行的特定重复值 让我们说:

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?

中做到这一点

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

这就是你要追求的吗?

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)

答案 2 :(得分:2)

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