我的表格如下:
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值。具有不同值的类别。 (我也可以过滤或删除重复项。)
问题:
如何在R中完成? Dplyr语法?我想知道Dplyr如何引用前一行并检查条件。
如何使用查询语言SQL实现?
感谢我的朋友们所有答案!
答案 0 :(得分:3)
在R
中,一种方法是使用dplyr
,因为这是一个小组,可以做一些问题。我们在按类别'分组后使用diff
。 diff
获取' 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
由于