Использование функции Min и Max внутри функции - PullRequest
0 голосов
/ 11 октября 2019

Я создал функцию, которая использует 2 переменные для группировки и использует третью переменную для создания min и max для каждой группы. Но функция min и max дает неправильный вывод. Он дает минимум и максимум для всего набора данных, а не для каждой группы.

myfunction= function(x,a,b,column) {
  temp=group_by(x,x[[a]],x[[b]])
   Score=summarise(temp,Totals=n(),Mnscore=min(x[[c]]),Mxscore=max(x[[c]]))
 return(Score)
}

myfunction(dataset,"a","b","c")


Actual Results:
a b Totals  Min Max
1 1  10     15  50
1 2  20     15  50
1 3  30     15  50

Expected results:
a b Totals  Min Max
1 1  10     20  48
1 2  20     21  49
1 3  30     15  50

Ответы [ 3 ]

1 голос
/ 11 октября 2019

Вы можете использовать пакет data.table, если вы хотите очень эффективный способ решения вашей проблемы. Попробуйте следующий минимальный воспроизводимый пример.

library(data.table)
set.seed(20191011L)

data <- data.table(
  V1 = letters[sample(3, 20, TRUE)],
  V2 = letters[sample(3, 20, TRUE)],
  V3 = runif(20)
)

fun <- function(data, groups, target){

  data[, .(min=min(get(target)), max=max(get(target))), mget(groups)]

}

fun(data, c("V1", "V2"), "V3")

##     V1 V2        min       max
##  1:  b  c 0.20653948 0.4618063
##  2:  a  a 0.09560888 0.3347064
##  3:  b  b 0.75071480 0.7507148
##  4:  c  a 0.66410519 0.8258410
##  5:  c  c 0.01303751 0.7635212
##  6:  a  b 0.04770186 0.6332439
##  7:  b  a 0.25069813 0.9008885
1 голос
/ 11 октября 2019

, чтобы написать функцию, вы можете сделать следующее:

library(tidyverse)
myfunction= function(x,a,b,column) 
  {
  column <- enquo(column)
  vars <- enquos(a,b)
  x %>% 
    group_by(!!!vars) %>% 
    summarise(Totals=n(),Mnscore=min(!!c),Mxscore=max(!!column))
}

, затем вызвать это, введя a, b, c как символы, а не как символы

myfunction(dataset,a,b,column)
0 голосов
/ 11 октября 2019

Попробуйте:

require(dplyr)

result = dataset %>% 
  dplyr::group_by(a,b) %>% 
  dplyr::summarise(Totals = n(),
                   Mnscore = min(c),
                   Mxscore = max(c))

Дайте мне знать, если это работает.

...