Найдите n-е наибольшие значения в верхней строке и опустите остальные столбцы в R - PullRequest
0 голосов
/ 11 мая 2018

Я пытаюсь изменить фрейм данных таким образом, чтобы я включал только те столбцы, в которых первое значение строки является n-м по величине.

Например, давайте предположим, что я хочу включить только те столбцы, где верхнее значение в строке 1 является вторым по величине (верхнее 2 по величине).

dat1 = data.frame(a = c(0.1,0.2,0.3,0.4,0.5), b = c(0.6,0.7,0.8,0.9,0.10), c = c(0.12,0.13,0.14,0.15,0.16), d = c(NA, NA, NA, NA, 0.5))

    a   b    c  d
1 0.1 0.6 0.12 NA
2 0.2 0.7 0.13 NA
3 0.3 0.8 0.14 NA
4 0.4 0.9 0.15 NA
5 0.5 0.1 0.16 0.5

, такое что aи d удаляются, поскольку 0.1 и NA не являются вторыми по величине значениями в строке 1. Здесь 0.6 и 0.12 больше, чем 0.1 и NA в столбце a и d соответственно.

    b    c 
1 0.6 0.12 
2 0.7 0.13
3 0.8 0.14 
4 0.9 0.15 
5 0.1 0.16

Есть ли простой способ сделать это?Я не хочу заказывать его, потому что это создаст проблемы с другими фреймами данных, которые у меня связаны.

Ответы [ 3 ]

0 голосов
/ 11 мая 2018

Дополняя ответ pieca, вы можете включить его в функцию. Кроме того, таким образом, возвращаемый data.frame не будет отсортирован.

get_nth <- function(df, n) {
  df[] <- lapply(df, as.numeric) # edit
  cols <- names(sort(df[1, ], na.last = NA, decreasing = TRUE))
  cols <- cols[seq(n)]
  df <- df[names(df) %in% cols]
  return(df)
}

Надеюсь, это работает для вас.

0 голосов
/ 11 мая 2018

Вы можете получить инвертированный ранг первой строки и взять верхние n-ые столбцы:

> r <- rank(-dat1[1,], na.last=T)
> r <- r <= 2
> dat1[,r]
    b    c
1 0.6 0.12
2 0.7 0.13
3 0.8 0.14
4 0.9 0.15
5 0.1 0.16
0 голосов
/ 11 мая 2018

Сортировка первой строки вашего data.frame, а затем подмножество по именам:

cols <- names(sort(dat1[1,], na.last = NA, decreasing = TRUE))
> dat1[,cols[1:2]]
    b    c
1 0.6 0.12
2 0.7 0.13
3 0.8 0.14
4 0.9 0.15
5 0.1 0.16
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...