我想删除数据框中每一行的特定重复值 让我们说:
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?
答案 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