楼主: 抖飞x
879 8

[数据管理求助] stata计算组内大于对应行数值的个数并求和 [推广有奖]

  • 0关注
  • 0粉丝

博士生

45%

还不是VIP/贵宾

-

威望
0
论坛币
355 个
通用积分
0.5242
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
337 点
帖子
18
精华
0
在线时间
563 小时
注册时间
2020-6-7
最后登录
2025-12-4

楼主
抖飞x 发表于 2023-7-24 11:16:07 |AI写论文
40论坛币
请问大家,如下图所示,使用stata时,以第1列为分组变量,如何计算组内大于对应第2列的数值的个数,并对其求和,进而得到像第3列和第4列这样的结果,第3列是是组内大于对应行的个数,第4列是组内大于对应行数值的数的求和,因此不同行有不同的结果,例如对于第一行,a组内大于1的有2和3这两个,因此第3列即个数为2,求和后第4列为5,对于第二行,a组内没有大于3的,因此第3列为0,求和后第4列为0或缺漏值。excel文件是相应的数据。 数据.xlsx (8.75 KB) 微信图片_20230724104250.png

关键词:Stata tata EXCEL exce xcel

沙发
lzsxy2009 发表于 2023-7-26 15:55:24
排序后给每个数字做序号,在改变排序方式得到另一个序列号,序列号减1就是你要的

藤椅
七极啊 发表于 2023-8-1 12:49:53
clear
input str20 id number
"a" 1
"a" 2
"a" 3
"a" 4
"b" 5
"b" 6
"b" 7
"b" 8
"c" 9
"c" 10
"c" 11
"c" 12
end
save 08,replace
rename (id number)(id1 number1)
save 0801,replace
clear
use 08
cross using 0801
drop if id !=id1
drop if number1==number
bysort id : gen re1=1 if number1>number
bysort id number: gen re2=sum(re1)
bysort id number :egen re3=max(re2)
bysort id number:egen re4=total(number1) if number1>number
bysort id number:keep if re2==re3
duplicates drop id number,force
keep id number re3 re4
rename (re3 re4)(结果1 结果2)

1690865358565.jpg (6.74 KB)

案例

案例

已有 1 人评分学术水平 热心指数 信用等级 收起 理由
4391111 + 2 + 2 + 2 热心帮助其他会员

总评分: 学术水平 + 2  热心指数 + 2  信用等级 + 2   查看全部评分

板凳
wxhpldmm 发表于 2023-8-1 15:46:22
可以试试 spssmax 这个网站(百度搜索就有),处理这种问题很简单的!可以一键生成。

报纸
七极啊 发表于 2023-8-2 10:57:15
之前分享的代码是组内没有重复值的情况下。如果组内出现了重复值需要做一些修正,如下:
clear
input str20 id number
"a" 2
"a" 2
"a" 2
"a" 2
"a" 2
"a" 8
"b" 5
"b" 6
"b" 10
"b" 8
"c" 5
"c" 10
"c" 15
"c" 12
end
save 08,replace
rename (id number)(id1 number1)
save 0801,replace
clear
use 08
cross using 0801
drop if id !=id1
drop if number1==number
bysort id : gen re1=1 if number1>number
bysort id number: gen re2=sum(re1)
bysort id number :egen re3=max(re2)
bysort id number:egen re4=total(number1) if number1>number
bysort id number:keep if re2==re3
duplicates drop id number,force
keep id number re3 re4
rename (re3 re4)(结果1 结果2)

save 0802,replace
clear

use 08
merge m:1 id number using 0802

gen k = 1 if number[_n]==number[_n-1] | number[_n]==number[_n+1]

bysort id number :  egen k1=total(k)
foreach v of varlist 结果1 结果2 {
bysort id:replace `v'=1/k1*`v' if number[_n]==number[_n+1] | number[_n]==number[_n-1]
}
drop k*
drop _merge
erase 08.dta
erase 0801.dta
erase 0802.dta

不懂得话可以来问我,也希望大家指出代码的问题。
已有 1 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
抖飞x + 5 + 1 + 1 + 1 精彩帖子

总评分: 论坛币 + 5  学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

地板
qianchen 发表于 2023-8-2 15:57:53
sort id number
bys id:gen 结果1=_N-_n if number[_n+1]>number[_n]
bys id:fillmissing 结果1,with(next)
gsort id -number
bys id:gen sum=sum(number) if number[_n-1]>number[_n]
gen 结果2=sum-number
bys id:fillmissing 结果2,with(previous)
已有 2 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
抖飞x + 10 + 2 + 2 + 2 精彩帖子
pengxhan + 5 + 4 + 4 + 4 精彩帖子简单有效

总评分: 论坛币 + 15  学术水平 + 6  热心指数 + 6  信用等级 + 6   查看全部评分

7
抖飞x 发表于 2023-8-7 16:32:03
lzsxy2009 发表于 2023-7-26 15:55
排序后给每个数字做序号,在改变排序方式得到另一个序列号,序列号减1就是你要的
非常感谢您的回复!!!

8
抖飞x 发表于 2023-8-7 16:32:21
qianchen 发表于 2023-8-2 15:57
sort id number
bys id:gen 结果1=_N-_n if number[_n+1]>number[_n]
bys id:fillmissing 结果1,with(ne ...
非常感谢您的回复!!!

9
抖飞x 发表于 2023-8-7 16:32:52
七极啊 发表于 2023-8-2 10:57
之前分享的代码是组内没有重复值的情况下。如果组内出现了重复值需要做一些修正,如下:
clear
input st ...
非常感谢您的回复!!!

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注jltj
拉您入交流群
GMT+8, 2026-2-7 19:40