создавать списки, содержащие числа, для которых столбец содержит максимальное значение этой строки - PullRequest
0 голосов
/ 19 ноября 2018

В кадре данных из 4 столбцов я ищу элегантный способ получить 3 списка, которые содержат имена из столбца 1, если максимум той строки, в которой находится это имя, находится соответственно в столбце 2, 3 или 4.

первый столбец содержит имена параметров, столбец 2 - результат теста Шапиро на необработанных данных параметра х столбец 3, результат теста шапиро преобразованных данных log10 для параметра х столбца 4, результат теста шапиро пользовательского преобразованиядается пользователем для параметра x

, если это данные:

          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 имеет наибольшее количество баллов

список 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).В строке мне нужно проверить, является ли xval максимумом из 3 столбцов;xval, xlog10val, xcustomval, если это так, добавьте параметр в строке THAT в список списка xval_is_the_max_of_3_columns

Затем мы делаем ту же строку PER для xlog10val.Если xlog10val в строке i является максимумом столбцов 2: 4, добавьте имя этой строки в список 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 голосов
/ 21 ноября 2018

Я не уверен, как именно вы выбираете параметры для списка два и три, однако, вы можете попробовать что-то вроде этого

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%

0 голосов
/ 19 ноября 2018

Мы можем использовать max.col, чтобы получить индекс максимального значения для каждой строки, и с этим мы устанавливаем «Параметр»

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

РЕДАКТИРОВАТЬ: на основе обсуждения с @ Mark

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...