Максимальная позиция агрегированного кадра данных - PullRequest
0 голосов
/ 14 мая 2018

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

df1=data.frame(groups=c('a','a','b','b','b','c'), c1=c(1:6), c2=c(2:7), c3=c(4:9))

print(df1)

row.    groups  c1  c2  c3

1.  a   1   2   4
2.  a   2   3   5
3.  b   3   4   6
4.  b   4   5   7
5.  b   5   6   8
6.  c   6   7   9


aggregate(df1[,2:4], by=list(df1$groups), FUN=max)



Group.1 c1 c2 c3

 1.       a  2  3  5      
 2.       b  5  6  8
 3.       c  6  7  9

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

df2=cbind(df1$groups,0-df1[,2:4])

print(df2)



df1$groups c1 c2 c3

1.          a -1 -2 -4        
2.          a -2 -3 -5
3.          b -3 -4 -6
4.          b -4 -5 -7
5.          b -5 -6 -8
6.          c -6 -7 -9

я хочу значение в df2, которое является максимальным в df1.Например:

Group.1 c1 c2 c3

1.       a  -2  -3  -5     
2.       b  -5  -6  -8
3.       c  -6  -7  -9

(Это искажение, сделанное только для примера. Мои исходные данные более сложны, но это то, что мне нужно)

Между тем я сделал двойной цикл, ноэто действительно недостаточно эффективно.

Я использую:

R version 3.4.2 (2017-09-28) -- "Short Summer"
Copyright (C) 2017 The R Foundation for Statistical Computing
Platform: x86_64-w64-mingw32/x64 (64-bit)

Ответы [ 2 ]

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

Кажется, что это не особенно тривиально, если индекс строки максимального значения может отличаться от столбца к столбцу (как я упоминал в комментарии к ответу выше).Я думаю, что вы не можете избежать двойной итерации (один раз над группой a / b / c и один раз над столбцом), чтобы получить максимальное значение для каждого столбца.Вы можете сделать это, например:максимальные значения из df2 путем первого разделения df2.

Увеличивает ли это скорость?Все-dplyr-решение было бы более элегантным, но я не уверен, возможно ли это.

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

Идея состоит в том, чтобы преобразовать имена строк в столбец и создать индексный вектор с ними. Затем используйте этот вектор для фильтрации df2, т.е.

library(tidyverse)

ind <-df1 %>% 
        rownames_to_column('rn') %>% 
        group_by(groups) %>% 
        filter_at(names(.)[3:5], all_vars(. == max(.))) %>% 
        pull(rn)

#[1] "2" "5" "6"

df2[i1,]

, что дает

  df1$groups c1 c2 c3
2          a -2 -3 -5
5          b -5 -6 -8
6          c -6 -7 -9
...