1
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

手順

4

3 に答える 3

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
于 2012-09-17T05:41:48.860 に答える
2

ラッププライアプローチ(ポールは1分で私を打ち負かしました):

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
于 2012-09-17T05:31:44.183 に答える
2

まず、各行の最大値のインデックスを見つけ、そのインデックスから行の末尾までのベクトルを作成する必要があります。適用ループを使用して行ごとにこれを行います。

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
于 2012-09-17T05:29:20.680 に答える