Filtrer les catégories dans lesquelles (dans une autre colonne) les valeurs diffèrent

Ma table ressemble à ceci:

Colonnes Excel

B|C|D Category | Value |No diff values within category? A 123 TRUE A 123 TRUE A 122 FALSE B 121 TRUE B 121 TRUE B 121 TRUE C 10 TRUE C 10 TRUE C 10 TRUE C 11 FALSE D 23 TRUE D 23 TRUE D 23 TRUE D 23 TRUE D 22 FALSE D 23 FALSE 

Nous sums en excel pour le moment et dans la troisième colonne j'ai = OU (B3 <> B2; C3 = C2) je vérifie si la catégorie de la rangée précédente est différente ou si la valeur de la rangée précédente est égale à la ligne courante.

Si VRAI, cela signifie qu'il n'y a pas de différence. Si FALSE – il y a une différence détectée dans la même catégorie.

Ensuite, je filter les valeurs FAUX dans la troisième col. avoir des catégories dans lesquelles il y a des valeurs différentes. (Je peux également filterr ou supprimer les duplicates).

QUESTION:

  1. Comment peut-il être accompli en R? Dplyr syntaxe? Je me request comment le Dplyr peut se référer à la rangée précédente et vérifier une condition.

  2. Comment peut-il être accompli en utilisant un langage de requête SQL?

    Merci mes amis pour toutes les réponses!

Dans R , une approche est avec dplyr car il s'agit d'un problème de groupe. Nous utilisons diff après regroupement par 'Catégorie'. Le diff obtient la différence des éléments adjacents dans 'Value', convertit en un vector logique en vérifiant si la sortie est 0 et concatène avec TRUE car la sortie de diff aura une longueur inférieure de 1 à la longueur du vector d'origine.

 library(dplyr) df1 %>% group_by(Category) %>% mutate(Diff1 = c(TRUE, diff(Value)==0)) # Category Value Diff1 # <chr> <int> <lgl> #1 A 123 TRUE #2 A 123 TRUE #3 A 122 FALSE #4 B 121 TRUE #5 B 121 TRUE #6 B 121 TRUE #7 C 10 TRUE #8 C 10 TRUE #9 C 10 TRUE #10 C 11 FALSE #11 D 23 TRUE #12 D 23 TRUE #13 D 23 TRUE #14 D 23 TRUE #15 D 22 FALSE #16 D 23 FALSE 

Une autre option dans R est data.table

 library(data.table) setDT(df1)[, Diff1 := c(TRUE, diff(Value)==0)), by = Category] 

Ou avec ave de base R

 df1$Diff1 <- with(df1, ave(Value, Category, FUN = function(x) c(TRUE, diff(x)==0))) 

Les données

 df1 <- structure(list(Category = c("A", "A", "A", "B", "B", "B", "C", "C", "C", "C", "D", "D", "D", "D", "D", "D"), Value = c(123L, 123L, 122L, 121L, 121L, 121L, 10L, 10L, 10L, 11L, 23L, 23L, 23L, 23L, 22L, 23L)), .Names = c("Category", "Value"), row.names = c(NA, -16L), class = "data.frame") 

Essayez cette requête dans SQL Server

  ;WITH CTE AS (SELECT ROW_NUMBER() OVER(ORDER BY (SELECT 100)) ID,Category,Value from Table) select a.Category,a.Value,case when (a.Category=b.Category) or (a.Value=b.Value) then 'TRUE' else 'FALSE' end [T/F] from CTE a inner join CTE b on a.id=b.id-1 

Merci