0

以下のようなデータを使用して、テストが true の場合、テスト列 (test_A など) のいずれかを対応する時間列 (time_A など) に再割り当てし、すべての真のテスト時間の最小値を見つけようとしています。 .

     [ID] [time_A] [time_B] [time_C] [test_A] [test_B] [test_C] [min_true_time]
[1,]    1        2        3        4    FALSE     TRUE     FALSE          ?
[2,]    2       -4        5        6     TRUE     TRUE     FALSE          ?
[3,]    3        6        1       -2     TRUE     TRUE      TRUE          ?
[4,]    4       -2        3        4     TRUE    FALSE     FALSE          ?

私の実際のデータ セットは非常に大きいため、if および for ループの試行は惨めに失敗しました。しかし、私は適用機能を進歩させることができません。

さらに負の時間、たとえば -2 は行 3 の最小値と見なされます。

どんな提案でも大歓迎です

4

1 に答える 1

1

あなたは多くの情報を提供しませんが、これはあなたが必要とすることだと思います。データセットが実際にどれだけ大きいかは言わないので、十分に効率的かどうかはわかりません。

#I assume your data is in a data.frame:
df <- read.table(text="ID time_A time_B time_C test_A test_B test_C 
1    1        2        3        4    FALSE     TRUE     FALSE
2    2       -4        5        6     TRUE     TRUE     FALSE
3    3        6        1       -2     TRUE     TRUE      TRUE
4    4       -2        3        4     TRUE    FALSE     FALSE")


#loop over all rows and subset column 2:4 with column 5:7, then take the mins
df$min_true_time <- sapply(1:nrow(df), function(i) min(df[i,2:4][unlist(df[i,5:7])]))
df
#  ID time_A time_B time_C test_A test_B test_C min_true_time
#1  1      2      3      4  FALSE   TRUE  FALSE             3
#2  2     -4      5      6   TRUE   TRUE  FALSE            -4
#3  3      6      1     -2   TRUE   TRUE   TRUE            -2
#4  4     -2      3      4   TRUE  FALSE  FALSE            -2

より速いかもしれない別の方法(私はベンチマークの気分ではありません):

m <- as.matrix(df[,2:4])
m[!df[,5:7]] <- NA
df$min_true_time <- apply(m,1,min,na.rm=TRUE)
于 2013-03-09T15:09:59.197 に答える