过滤类别(在另一列中)值不同的类别

时间:2016-06-20 08:26:06

标签: sql sql-server r tsql dplyr

我的表格如下:

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

我们现在处于优势,在第三栏中我有 = OR(B3<> B2; C3 = C2) 我检查前一行的类别是否不同,或者前一行的值是否等于当前行。

如果为TRUE,则表示没有区别。如果为FALSE - 在同一类别中检测到差异。

然后我过滤掉第三列中的FALSE值。具有不同值的类别。 (我也可以过滤或删除重复项。)

问题:

  1. 如何在R中完成? Dplyr语法?我想知道Dplyr如何引用前一行并检查条件。

  2. 如何使用查询语言SQL实现?

    感谢我的朋友们所有答案!

2 个答案:

答案 0 :(得分:3)

R中,一种方法是使用dplyr,因为这是一个小组,可以做一些问题。我们在按类别'分组后使用diffdiff获取' Value'中相邻元素的差异,通过检查输出是否为0并与TRUE连接作为{{1}的输出来转换为逻辑向量}的长度比原始矢量的长度小一个。

diff

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 中的另一个选项是R

data.table

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

中的ave
base R

数据

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

答案 1 :(得分:1)

在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

由于