Использование purrr по ряду вместо apply () для всей строки - PullRequest
5 голосов
/ 10 мая 2019

Я хочу заменить apply() (и его производные) функцией purrr.

У меня есть data.frame, подобный этому:

> df
  V1 V2 V3
1 NA  2  3
2  2 NA  3
3  3  3 NA

И я хочу применить две функции по очереди: min(x, na.rm = T) и which.min(x) и вернуть результаты в виде фрейма данных.

Если я знаю, сколько столбцов, я могу сделать, например. это:

pmap_dfr(df, function(V1, V2, V3) {data.frame(min = pmin(V1, V2, V3, na.rm = T),
                                              where = which.min(c(V1, V2, V3)))})

  min where
1   2     2
2   2     1
3   3     1

Как сделать так, чтобы pmap() или любая другая функция purrr принимала всю строку в качестве аргумента, как это делает apply()?

func <- function(x) {data.frame(min = min(x, na.rm = T), where = which.min(x))}

> Reduce(rbind, apply(df,1, func))
    min where
V2    2     2
V1    2     1
V11   3     1


Я, наверное, просто пропустил функцию или какой-то трюк. Спасибо за вашу помощь.

Ответы [ 3 ]

3 голосов
/ 10 мая 2019

Ваше решение будет работать для всех столбцов, если вы используете многоточие.

pmap_dfr(df, ~data.frame(min = min(..., na.rm = TRUE), where = which.min(c(...)))) 

  min where
1   2     2
2   2     1
3   3     1
2 голосов
/ 10 мая 2019

Возможны следующие варианты:

df %>%
 mutate(min = invoke(pmin, na.rm = TRUE, .),
        where = max.col(!is.na(-.)[, 1:length(.)], ties.method = "first"))

  V1 V2 V3 min where
1 NA  2  3   2     2
2  2 NA  3   2     1
3  3  3 NA   3     1

Или, если вы хотите оставить только последние два столбца:

df %>%
 transmute(min = invoke(pmin, na.rm = TRUE, .),
        where = max.col(!is.na(-.)[, 1:length(.)], ties.method = "first"))
1 голос
/ 10 мая 2019

Не purrr -растворение, а data.table онелинер.

library(data.table)

dt <- fread("row V1 V2 V3
1 NA  2  3
2  2 NA  3
3  3  3 NA")

melt(dt, id.vars = "row")[ , .SD[which.min(value)], by = row]
   row variable value
1:   1       V2     2
2:   2       V1     2
3:   3       V1     3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...