0
votes

Utilisation de la fonction min et max dans une fonction

J'ai créé une fonction qui utilise 2 variables pour regrouper et utilise une troisième variable pour créer min et max pour chaque groupe. Mais la fonction min et max donne une mauvaise sortie. Il donne le minimum et le maximum pour l'ensemble du jeu de données et non pour chaque groupe.

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


1 commentaires

Vous devez en apprendre davantage sur les évaluations paresseuses et les citations quasi dans R.


3 Réponses :


0
votes

Essayez ceci:

require(dplyr)

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


3 commentaires

Comment est-ce une fonction?


@OnyAmbu, ce n'est pas que l'op n'a pas nécessairement besoin d'une fonction ici.


Je souhaite créer en fonction car je dois utiliser cette fonction plusieurs fois.



1
votes

Vous pouvez utiliser le package data.TAble. / code> si vous souhaitez un moyen très efficace de résoudre votre problème. Essayez l'exemple reproductible minimal suivant.

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


4 commentaires

Je souhaite créer en fonction car je dois utiliser cette fonction plusieurs fois.


Désolé, vous n'avez pas vu que vous avez demandé une fonction. Je modifie ma réponse pour la mettre en œuvre comme une fonction.


Je reçois cette erreur: erreur in. (Min = min (get (cible)), max = max (get (cible))): Impossible de trouver la fonction "".


Assurez-vous que vos données sont un datable.table et non a data.frame



1
votes

Pour écrire une fonction, vous pouvez effectuer ce qui suit:

myfunction(dataset,a,b,column)


2 commentaires

rlang 0.4.0 Ajout d'un Nouvel opérateur Curly-Curly , qui est effectivement un raccourci pour !! () . Donc, maintenant, vous pouvez simplement faire ...%>% (totaux = n (), mnscore = min ({{colonne}}), mxscore = max ({{colonne}})) . (En outre, il n'est généralement pas conseillé d'utiliser C en tant que nom de variable en raison de son conflit avec l'intégré C () .)


@Artemsokolov true sa non souhaitable d'utiliser c.