在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))
答案 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%
进行否定选择