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

创建包含行号的列表,其中列i包含该行的最大值

  •  1
  • Mark  · 技术社区  · 7 年前

    在一个包含4列的数据框架中,我正在寻找一种优雅的方法来获取包含第1列中的名称的3个列表,如果该名称所在行的最大值分别位于第2、3或4列中。

    第一列包含参数名, 第3列,参数x的log10转换数据的shapiro测试结果

    如果这是数据:

              Parameter       xval xlog10val xcustomval
    1       FWS.Range 0.62233371 0.9741614  0.9619065
    2    FL.Red.Range 0.48195980 0.9855781  0.9643206
    3 FL.Orange.Range 0.43338087 0.9727243  0.8239867
    4 FL.Yellow.Range 0.53554943 0.9022795  0.9223407
    5 FL.Red.Gradient 0.35194524 0.9905047  0.5718224
    6       SWS.Range 0.46932823 0.9487955  0.9825318
    7      SWS.Length 0.02927791 0.4565962  0.7309313
    8 FWS.Fill.factor 0.93764311 0.8039806  0.0000000
    9    FL.Red.Total 0.22437754 0.9655873  0.9923307
    

    问题:如何获取一个列表,告诉我所有参数名称,其中xlog10val是三列(xval、xlog10val、xcuxtomval)中最高的一列

    详细的解释,也许忽略。。。。

    'FWS.Fill.factor' 因为那是唯一一排 xval 他得分最高

    'FWS.Range', 'FL.Red.Range', 'FL.Orange.Range', 
    'FL.Red.Gradient', 'FWS.Fill.factor'
    

    然后列出其余的3个名字

    df$Parameter[which(df$xval == max(df[ ,2:4]))]
    

    但这给了 integer(0) 结果。

    澄清: 让我们从第2列(xval)开始。 如果是这种情况,请将该行中的参数添加到xval列表中

    然后我们对xlog10val每行执行相同的操作。如果第i行中的xlog10val是2:4列的最大值,则将该行的名称添加到xlog10val_是_3_列的最大值列表中。

    要制作DF,请执行以下操作:

    df <- data.frame(Parameter = c('FWS.Range', 'FL.Red.Range', 'FL.Orange.Range', 'FL.Yellow.Range', 'FL.Red.Gradient','SWS.Range','SWS.Length','FWS.Fill.factor','FL.Red.Total'),
            xval = c(0.622333705577588,0.481959800402278,0.433380866119736,0.535549430820635,0.351945244290616,0.469328232931424,0.0292779051823701,0.93764311477813,0.224377540663707),
            xlog10val =  c( 0.974161367853916,0.985578135386898,0.97272429360688,0.902279501804112,0.990504657326703,0.94879549470406,0.45659620937997,0.803980592920426,0.965587334461157),
            xcustomval = c(0.961906534164457,0.964320569400919,0.823986745004031,0.922340716468745,0.571822393107348,0.982531798077881,0.73093132928955,0,0.992330722386105))
    
    2 回复  |  直到 7 年前
        1
  •  2
  •   akrun    7 年前

    我们可以使用 max.col 为了获得每行最大值的索引,我们将“参数”子集化

    i1 <- max.col(df[-1], 'first')
    split(df$Parameter, i1)
    

    编辑:基于与@Mark的讨论

        2
  •  -1
  •   RodrigoGM    7 年前

    我不确定您是如何为列表2和列表3选择参数的,但是,您也可以尝试类似的方法

    df$Parameter <- as.character(df$Parameter)
    
    par.xval.max <- df[which.max(df$xval), "Parameter"]
    par.col3.gt.max <- df[df$xlog10val > max(df$xval), "Parameter"]
    par.rem <- df$Parameter[! df$Parameter %in% c(par.xval.max, par.col3.gt.max)]
    

    在这种情况下,第三列中的值大于 max(df$xval) ,其余参数通过使用负选择获取 %in%