代码之家  ›  专栏  ›  技术社区  ›  km5041

R: 构建Apply函数,根据其他(相关)列中的条件查找最小列

  •  0
  • km5041  · 技术社区  · 12 年前

    使用下面这样的数据,如果测试为真,我将尝试将任何测试列(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行的最小时间。

    欢迎任何建议

    1 回复  |  直到 12 年前
        1
  •  1
  •   Roland    12 年前

    你没有提供太多信息,但我认为这正是你所需要的。不知道它是否足够高效,因为你没有说你的数据集实际上有多大。

    #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)