R: рядный n-й элемент упорядоченные значения строк - PullRequest
1 голос
/ 02 апреля 2020

У меня есть эти входные данные:

t <- data.frame(x=c(1,2,8,4), y=c(2,3,4,5), k=c(3,4,5,1))

И я хочу, чтобы nth-самый низкий элемент строки данных упорядочивался по значениям строки по порядку, чтобы выходные данные выглядели примерно так (пример для nth_element = 2):

[1] 2 3 5 4

Я попробовал такую ​​функцию:

apply(t, 1, nth, n=1, order_by = .)

Но это не работает. Два вопроса:

  • Что я должен набрать в графе order_by, чтобы эта функция работала?
  • Какой лучший способ суммировать строки с помощью собственной функции итога, если я этого не сделаю хотите упомянуть имена столбцов в итоговой функции строки?

Sidenote:

  • Я не хочу упоминать имена столбцов конкретно, я хочу использовать функцию все строки в наборе данных.
  • Я пробовал функцию rownth из пакета Rfast, но она дает только один результат. Кто-нибудь знает, что я делаю не так?

Ответы [ 3 ]

2 голосов
/ 02 апреля 2020

Мы можем использовать apply и sort для этого.

d <- data.frame(x=c(1,2,8,4), y=c(2,3,4,5), k=c(3,4,5,1))

nth_lowest <- 2
apply(d, 1, FUN = function(x) sort(x)[nth_lowest])
# [1] 2 3 5 4

Обратите внимание, что я вызываю данные d вместо t. t уже является зарезервированным именем в R (функция транспонирования матрицы).

1 голос
/ 04 апреля 2020

Используя Rfast, вы можете сократить время выполнения для больших матриц и только для матриц.

d <- data.frame(x=c(1,2,8,4), y=c(2,3,4,5), k=c(3,4,5,1))
d<- Rfast::data.frame.to_matrix(d)

nth_lowests <- rep(2,ncol(d))
Rfast::rownth(d,nth_lowests)
# [1] 2 3 5 4

Вы также можете использовать параллельную версию Rfast :: rownth

1 голос
/ 02 апреля 2020

Не так элегантно, как ответ @ bouncyball, но с использованием dplyrtidyr), одна возможность состоит в следующем:

library(dplyr)
library(tidyr)

t %>% mutate(Row = row_number()) %>%
  pivot_longer(-Row, names_to = "Col", values_to = "Val") %>%
  group_by(Row) %>% 
  arrange(Val) %>% 
  slice(2) %>% 
  select(Val)

Adding missing grouping variables: `Row`
# A tibble: 4 x 2
# Groups:   Row [4]
    Row   Val
  <int> <dbl>
1     1     2
2     2     3
3     3     5
4     4     4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...