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

时间:2018-11-19 18:45:09

标签: r dataframe

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

第一列包含参数名称, 第2列基于参数x原始数据的shapiro测试结果 第3列,参数x的log10转换数据的shapiro测试结果 第4栏,用户为参数x给出的自定义转换的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)中最高的列

详细说明,也许忽略。 ....

列表1,xval为最高值的行应如下所示:'FWS.Fill.factor',因为那是xval得分最高的行

list 2是xlog10val是最大值的所有行的列表,因此应包含xlog10val是该行最大值的参数的名称:

'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)开始。 PER行,我需要测试xval是否为3列的最大值; xval,xlog10val,xcustomval 如果是这种情况,请在THAT行中的参数添加到xval_is_the_max_of_3_columns列表的列表中

然后,对xlog10val执行相同的PER行。如果第i行中的xlog10val是列2:4的最大值,则将该ROW的名称添加到xlog10val_is_the_max_of_3_columns列表中。

制作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 个答案:

答案 0 :(得分:2)

我们可以使用max.col来获取每行最大值的索引,并以此子集“参数”

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

编辑:基于与@Mark的讨论

答案 1 :(得分:-1)

我不确定您如何选择清单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%进行否定选择