0

使用以下数据,如果测试为真,我试图将任何测试列(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 回答