Подсчет количества появлений с несколькими условиями - PullRequest
2 голосов
/ 22 апреля 2019

Я пытаюсь подсчитать, сколько раз электронное письмо появляется в моих данных, если оно появляется на 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, потому что она появляется три раза).

Итак, два моих условия:

  1. Подсчитывать только те адреса электронной почты, которые появляются на неделе 6 хотя бы один раз.
  2. Считайте только один раз в неделю.

ТИА!

1 Ответ

1 голос
/ 23 апреля 2019

Это воссоздаст пример данных, которые вы дали:

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).
...