计算多个条件下的出现次数

时间:2019-04-22 13:53:27

标签: spss

我正在尝试计算电子邮件在第6周出现在数据中的次数。我目前正在使用此代码

if week=6 has6=1.
aggregate out=* mode=addvariables overwrite=yes/break=email /has6=max(has6).
aggregate out=* mode=addvariables /break=email /n=sum(has6).

这正在按预期工作,但我遗漏了一个我需要的条件。电子邮件地址每周可以显示多次,但是我只想每周计数一次。

例如:

  Email            Week         N
jane@aol.com         6          2
bill@gmail.com       3          
bill@gmail.com       4         
sarah@hotmail.com    6          1
jane@aol.com         4          2
jane@aol.com         4          2

因此,即使jane@aol.com出现在数据中三次,但我只希望她显示为N = 2,因为她在不同的星期(6和4)中只出现两次。我不希望它计算第4周的第二个实例(这是当前代码正在执行的操作:由于出现了3次,因此被计为3)。

所以我的两个条件是:

  1. 仅统计在第6周中至少出现一次的电子邮件地址。
  2. 每周仅计数一次。

TIA!

1 个答案:

答案 0 :(得分:1)

这将重新创建您提供的示例数据:

data list list/email(a50) week(f1).
begin data
"jane@aol.com" 6
"bill@gmail.com" 3
"bill@gmail.com" 4
"sarah@hotmail.com" 6
"jane@aol.com" 4
"jane@aol.com" 4
end data.

首先,我们将至少确定第6周的每封电子邮件,并标记所有发生的邮件:

if week=6 has6=1.
aggregate out=* mode=addvariables overwrite=yes/break=email /has6=max(has6).

现在有两种进行方式。

第一种方法:第二种汇总并将结果重新附加到数据:。

sort cases by email week.
dataset name orig.
dataset declare agg.
aggregate out=agg /break=email week/has6=max(has6).
dataset activate agg.
select if has6.
aggregate out=* mode=addvariables/break email/n=n.
dataset activate orig.
match files /file=* /table=agg /by email week.
exe.

第二种方法:比较行以打折非唯一的情况:

sort cases by email week.
compute countThis=has6.
if $casenum>1 and has6 and lag(email)=email and lag(week)=week countThis=0.
exe.
aggregate out=* mode=addvariables /break=email /n=sum(countThis).