我有以下数据集,并希望通过子集找到最大值 数据集
StudentID Indicator Value
100 N 30
100 N 35
100 N 28
100 Y 20
100 N 29
100 N 60
200 N 40
200 N 35
200 Y 20
200 N 24
200 N 35
我希望结果如下:
的结果
StudentID Indicator Value Max
100 N 30 35
100 N 35 35
100 N 28 35
100 N 29 60
100 N 60 60
200 N 40 40
200 N 35 40
200 N 24 35
200 N 35 35
基本上,每当指标从N变为Y时,我需要将studentID和IndicatorID的行视为一个块,并计算该块的最大值并继续下一次迭代。
答案 0 :(得分:1)
以下是pandas
使用python
的选项。我们通过获取逻辑输出(dat.Indicator == "Y"
的累积总和来创建分组变量,然后通过删除'Indicator'为“Y”的行来对行进行子集,按“StudentID”,“Group”分组,得到max
的“{值”transform
,将其分配给“值”,将drop
列为不需要的列
dat['Group'] = (dat.Indicator == "Y").cumsum()
datS = dat[dat.Indicator != "Y"]
datS1 = datS.copy()
datS1['Value'] = datS.groupby(['StudentID', 'Group'])['Value'].transform('max')
datS1.drop('Group', axis = 1, inplace = True)
datS1
-output
base R
选项为ave
dat$Value <- with(dat, ave(Value, cumsum(Indicator == "Y"), FUN = max))
subset(dat, Indicator != "Y")
# StudentID Indicator Value
#1 100 N 35
#2 100 N 35
#3 100 N 35
#5 100 N 60
#6 100 N 60
#7 200 N 60
#8 200 N 60
#10 200 N 35
#11 200 N 35
import pandas as pd
dat = pd.DataFrame({'StudentID': [100, 100, 100, 100, 100, 100, 200, 200, 200, 200, 200],
'Indicator':[ "N", "N", "N", "Y", "N", "N", "N", "N", "Y", "N", "N"],
'Value':[30, 35, 28, 20, 29, 60, 40, 35, 20, 24, 35]})
#R
dat <-structure(list(StudentID = c(100L, 100L, 100L, 100L, 100L, 100L,
200L, 200L, 200L, 200L, 200L), Indicator = c("N", "N", "N", "Y",
"N", "N", "N", "N", "Y", "N", "N"), Value = c(35L, 35L, 35L,
60L, 60L, 60L, 60L, 60L, 35L, 35L, 35L)), .Names = c("StudentID",
"Indicator", "Value"), row.names = c(NA, -11L), class = "data.frame")
答案 1 :(得分:0)
您缺少一个表示组的变量。您可以使用notsorted
语句中的by
选项在SAS中轻松完成此操作。
data grouped ;
retain group 0;
set have ;
by studentid indicator notsorted;
group + first.indicator;
run;
现在有很多方法可以按组生成平均值,因为它们已定义。 PROC SQL
可以自动将聚合值重新合并到细节线上,从而轻松实现。
proc sql ;
select *,max(value) as max
from grouped
group by group
;
quit;
结果:
group StudentID Indicator Value max
1 100 N 35 35
1 100 N 30 35
1 100 N 28 35
2 100 Y 20 20
3 100 N 60 60
3 100 N 29 60
4 200 N 40 40
4 200 N 35 40
5 200 Y 20 20
6 200 N 35 35
6 200 N 24 35
我不确定为什么您的示例输出已删除了具有INDICATOR ='Y'的组,但您只需添加where
子句即可将其删除。