我需要一种方法来查找某行是否有值,如果有,那么我需要根据另一个值对所有行进行分组
I need a way to find if a row has a value, and if so then I need to group all rows based on another value
我需要一种方法来检查是否找到了一个值,例如 'Error',如果找到了,那么我需要根据另一个值进行分组。我需要查找值 3,如果找到值 3,那么我需要对具有相同 ID 和值 1 的所有行进行分组和标记。
注意:我在 SAS 工作。
请看下面table:
|id|Value1|Value2 |Value3
|--| --- | --- | ---
|1 | Sta |sta@example.com |Error
|2 |Danny |dany@example.com|
|3 |Elle |elle@example.com|18
|1 | Sta |sta@example.com |55
|2 |Danny |dany@example.com|
|3 |Elle |elle@example.com|Error
|1 | Sta |sta@example.com |67
|1 | Sta |sta@example.com |57
|3 |Elle |elle@example.com|12
|3 |Elle |elle@example.com|15
|3 |Elle |elle@example.com|12
我需要把上面的table变成这样:
|id|Value1|Value2 |Value3
|--| --- | --- | ---
|1 | Sta |sta@example.com |Error
|2 |Danny |dany@example.com|NoError
|3 |Elle |elle@example.com|Error
我尝试过 case when 然后按 ID 分组,但没有成功。任何帮助将不胜感激。干杯。
你好。你可以使用 Row_Number
Select ROW_NUMBER() OVER(Partition by Value3 ORDER BY Value1) AS Row_Number ,
* from YourTable
您的描述令人困惑,但输出看起来像您想要按 ID、VALUE1 和 VALUE2 分组,然后测试该组中的任何观察值是否在 VALUE3 中有错误。
SAS 将 True/False 的布尔表达式计算为 1/0。因此,一组布尔表达式的 MAX() 正在测试表达式是否为真。
proc sql ;
select id, value1, value2
, case when (max( value3='Error')) then 'Error' else 'NoError' end as Value3
from have
group by id, value1, value2
;
quit;
结果:
id Value1 Value2 Value3
-------------------------------------------------
1 Sta sta@example.com Error
2 Danny dany@example.com NoError
3 Elle elle@example.com Error
在基础 SAS 中:
** Find unique ID/value1/value2 combos with any error **;
proc sort data=have (where=(value3='Error')) out=any_error (keep=id value1 value2) nodupkey; by id value1 value2;
** Keep first occurrence of each ID/value1/value2 combination, assigning value3 to Error if any error in original data, else NoError **;
data want;
merge have (keep=id value1 value2) any_error (in=in1); by id value1 value2;
if first.id value1 value2;
value3 = ifc(in1,'Error','NoError');
run;
我需要一种方法来检查是否找到了一个值,例如 'Error',如果找到了,那么我需要根据另一个值进行分组。我需要查找值 3,如果找到值 3,那么我需要对具有相同 ID 和值 1 的所有行进行分组和标记。
注意:我在 SAS 工作。
请看下面table:
|id|Value1|Value2 |Value3
|--| --- | --- | ---
|1 | Sta |sta@example.com |Error
|2 |Danny |dany@example.com|
|3 |Elle |elle@example.com|18
|1 | Sta |sta@example.com |55
|2 |Danny |dany@example.com|
|3 |Elle |elle@example.com|Error
|1 | Sta |sta@example.com |67
|1 | Sta |sta@example.com |57
|3 |Elle |elle@example.com|12
|3 |Elle |elle@example.com|15
|3 |Elle |elle@example.com|12
我需要把上面的table变成这样:
|id|Value1|Value2 |Value3
|--| --- | --- | ---
|1 | Sta |sta@example.com |Error
|2 |Danny |dany@example.com|NoError
|3 |Elle |elle@example.com|Error
我尝试过 case when 然后按 ID 分组,但没有成功。任何帮助将不胜感激。干杯。
你好。你可以使用 Row_Number
Select ROW_NUMBER() OVER(Partition by Value3 ORDER BY Value1) AS Row_Number ,
* from YourTable
您的描述令人困惑,但输出看起来像您想要按 ID、VALUE1 和 VALUE2 分组,然后测试该组中的任何观察值是否在 VALUE3 中有错误。
SAS 将 True/False 的布尔表达式计算为 1/0。因此,一组布尔表达式的 MAX() 正在测试表达式是否为真。
proc sql ;
select id, value1, value2
, case when (max( value3='Error')) then 'Error' else 'NoError' end as Value3
from have
group by id, value1, value2
;
quit;
结果:
id Value1 Value2 Value3
-------------------------------------------------
1 Sta sta@example.com Error
2 Danny dany@example.com NoError
3 Elle elle@example.com Error
在基础 SAS 中:
** Find unique ID/value1/value2 combos with any error **;
proc sort data=have (where=(value3='Error')) out=any_error (keep=id value1 value2) nodupkey; by id value1 value2;
** Keep first occurrence of each ID/value1/value2 combination, assigning value3 to Error if any error in original data, else NoError **;
data want;
merge have (keep=id value1 value2) any_error (in=in1); by id value1 value2;
if first.id value1 value2;
value3 = ifc(in1,'Error','NoError');
run;