Col1<-c(3,8,2,4,2)
Col2<-c(3,7,3,9,2)
Col3<-c(5,7,5,7,5)
Col4<-c(1,9,2,3,4)
Col5<-c(1,2,6,7,5)
Toy<-data.frame(Col1,Col2,Col3,Col4,Col5)
> Toy
Col1 Col2 Col3 Col4 Col5
1 3 3 5 1 1
2 8 7 7 9 2
3 2 3 5 2 6
4 4 9 7 3 7
5 2 2 5 4 5
鉴于上述数据框,我想删除每行中等于每行最大值的值,以及最大值右边(或增加列#)的值。
逻辑上,声明是:
1. Find max value per row
2. Make max value for each row = NA
3. Make all columns to the right of column with max value =NA
所以新数据框看起来像
Col1 Col2 Col3 Col4 Col5
1 3 3 NA NA NA
2 8 7 7 NA NA
3 2 3 5 2 NA
4 4 NA NA NA NA
5 2 2 NA NA NA
步骤
答案 0 :(得分:11)
这是一个基于apply()
的解决方案,可以避免显式的for循环:
ff <- function(X) {X[which.max(X):length(X)] <- NA; X}
t(apply(Toy, 1, ff))
# Col1 Col2 Col3 Col4 Col5
# [1,] 3 3 NA NA NA
# [2,] 8 7 7 NA NA
# [3,] 2 3 5 2 NA
# [4,] 4 NA NA NA NA
# [5,] 2 2 NA NA NA
答案 1 :(得分:2)
首先,我们需要为每一行找到最大值的索引,并构造一个向量,该索引的索引位于行的末尾。我们希望使用apply循环每行执行此操作:
list_of_indices = apply(Toy, 1, function(x) which.max(x):ncol(Toy))
> list_of_indices
[[1]]
[1] 3 4 5
[[2]]
[1] 4 5
[[3]]
[1] 5
[[4]]
[1] 2 3 4 5
[[5]]
[1] 3 4 5
然后我们可以循环索引列表并将NA
分配给data.frame
中的适当位置:
for(i in seq_along(list_of_indices)) {
Toy[i,list_of_indices[[i]]] <- NA
}
这导致了期望的结果:
> Toy
Col1 Col2 Col3 Col4 Col5
1 3 3 NA NA NA
2 8 7 7 NA NA
3 2 3 5 2 NA
4 4 NA NA NA NA
5 2 2 NA NA NA
答案 2 :(得分:2)
一种la la方式(保罗在一分钟之内击败我):
inds <- lapply(apply(Toy, 1, which.max), function(x) x:ncol(Toy))
lapply(1:nrow(Toy), function(i) {Toy[i, inds[[i]]] <<- NA; return(Toy)})
Toy