楼主: Miuka。
2432 6

[数据管理求助] 请问大家,如何用循环语句对数据进行加总? [推广有奖]

  • 0关注
  • 0粉丝

本科生

43%

还不是VIP/贵宾

-

威望
0
论坛币
979 个
通用积分
5.2422
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
815 点
帖子
25
精华
0
在线时间
143 小时
注册时间
2019-10-5
最后登录
2023-9-20

楼主
Miuka。 学生认证  发表于 2020-11-11 09:17:18 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
我在做数据整理的时候,遇到如下问题:
有数据Njai_k,i=[1,6],j=[1,20],k=[1,16]。
想得到Njai=Njai_1+Njai_2+……+Njai_16 i=[1,6],j=[1,20](比如N1a1=N1a1_1+N1a1_2+……+N1a1_16)
最后得到120个加总后的新变量。数据都是0-1变量。

我用的命令是
  • forvalues k=1/16 {
  •         forvalues i=1/6 {
  •        forvalues j=1/20 {
  •                         egen N`j'a`i'=rowtotal(N`j'a`i'_`k')
  •                 }
  •      }
  • }



变量能生成出来,但结果不太对。

恳切请求各位的帮助!
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:循环语句 如何用 forvalues forvalue values

沙发
Miuka。 学生认证  发表于 2020-11-11 09:37:36
因为是对16个变量求总,如果通过最笨的方法要120(6*20)次,所以想试试用循环做
希望各位大佬老帮帮我

藤椅
DΘstinyじò 发表于 2020-11-11 13:09:43
Miuka。 发表于 2020-11-11 09:37
因为是对16个变量求总,如果通过最笨的方法要120(6*20)次,所以想试试用循环做
希望各位大佬老帮帮我[cr ...
不知道你的这个数据是怎么排列的,是值为一个变量,下标参数为三个变量?还是一行120个变量?
最好是对数据结构给出一些说明,怎么排列的,建议用dataex(ssc install dataex)命令贴出示例数据。
一行单值可以尝试以下代码,其他情况要根据需要修改。
  1. forvalues i=1/6 {
  2.         forvalues j=1/20 {
  3.         gen N`j'a`i'=0
  4.                 forvalues k=1/16 {
  5.                         replace N`j'a`i'=N`j'a`i'+N`j'a`i'_`k'
  6.                         }
  7.         }
  8. }
复制代码

板凳
Miuka。 学生认证  发表于 2020-11-11 15:41:24
DΘstinyじò 发表于 2020-11-11 13:09
不知道你的这个数据是怎么排列的,是值为一个变量,下标参数为三个变量?还是一行120个变量?
最好是对数 ...
我现有的变量是一共有20*6*16个:
  • N1a1_1 N2a1_1 N3a1_1 N4a1_1 N5a1_1 N6a1_1 N7a1_1 N8a1_1 N9a1_1 N10a1_1 N11a1_1 N12a1_1 N13a1_1 N14a1_1 N15a1_1 N16a1_1 N17a1_1 N18a1_1 N19a1_1 N20a1_1
  • N1a2_1 N2a2_1 N3a2_1 N4a2_1 N5a2_1 N6a2_1 N7a2_1 N8a2_1 N9a2_1 N10a2_1 N11a2_1 N12a2_1 N13a2_1 N14a2_1 N15a2_1 N16a2_1 N17a2_1 N18a2_1 N19a2_1 N20a2_1
  • .......
  • N1a6_1 N2a6_1 N3a6_1 N4a6_1 N5a6_1 N6a6_1 N7a6_1 N8a6_1 N9a6_1 N10a6_1 N11a6_1 N12a6_1 N13a6_1 N14a6_1 N15a6_1 N16a6_1 N17a6_1 N18a6_1 N19a6_1 N20a6_1
  • N1a1_2 N2a1_2 N3a1_2 N4a1_2 N5a1_2 N6a1_2 N7a1_2 N8a1_2 N9a1_2 N10a1_2 N11a1_2 N12a1_2 N13a1_2 N14a1_2 N15a1_2 N16a1_2 N17a1_2 N18a1_2 N19a1_2 N20a1_2
  • N1a2_2 N2a2_2 N3a2_2 N4a2_2 N5a2_2 N6a2_2 N7a2_2 N8a2_2 N9a2_2 N10a2_2 N11a2_2 N12a2_2 N13a2_2 N14a2_2 N15a2_2 N16a2_2 N17a2_2 N18a2_2 N19a2_2 N20a2_2
  • .........
  • N1a5_16 N2a5_16 N3a5_16 N4a5_16 N5a5_16 N6a5_16 N7a5_16 N8a5_16 N9a5_16 N10a5_16 N11a5_16 N12a5_16 N13a5_16 N14a5_16 N15a5_16 N16a5_16 N17a5_16 N18a5_16 N19a5_16 N20a5_16
  • N1a6_16 N2a6_16 N3a6_16 N4a6_16 N5a6_16 N6a6_16 N7a6_16 N8a6_16 N9a6_16 N10a6_16 N11a6_16 N12a6_16 N13a6_16 N14a6_16 N15a6_16 N16a6_16 N17a6_16 N18a6_16 N19a6_16 N20a6_16


我想得到的是20*6=120个变量:
N1a1=N1a1_1+N1a1_2+.....+N1a1_16
N2a1=N2a1_1+N2a1_2+.....+N2a1_16
...
N20a1=N20a1_1+N20a1_2+.....+N20a1_16N1a2=N1a2_1+N2a2_2+.....+N20a2_16
N2a2=N2a2_1+N2a2_2+.....+N2a2_16
...
N20a2=N20a2_1+N20a2_2+.....+N20a2_16
...
N20a6=N20a6_1+N20a6_2+.....+N20a6_16

dataex命令跑不出来
我截了部分图您可以看一下



1111.jpg (527.57 KB)

1111.jpg

报纸
Miuka。 学生认证  发表于 2020-11-11 17:50:30
DΘstinyじò 发表于 2020-11-11 13:09
不知道你的这个数据是怎么排列的,是值为一个变量,下标参数为三个变量?还是一行120个变量?
最好是对数 ...
谢谢您的帮助,受您的启发我想出来咋做了已经!我的命令如下:

forvalues i=1/6 {
       forvalues j=1/20 {
                        gen N113_`j'a`i'=N`j'a`i'_1+N`j'a`i'_2+N`j'a`i'_3+N`j'a`i'_4+N`j'a`i'_5+N`j'a`i'_6+N`j'a`i'_7+N`j'a`i'_8+N`j'a`i'_9+N`j'a`i'_10+N`j'a`i'_11+N`j'a`i'_12+N`j'a`i'_13+N`j'a`i'_14+N`j'a`i'_15+N`j'a`i'_16
                }
     }

地板
DΘstinyじò 发表于 2020-11-11 22:21:05
Miuka。 发表于 2020-11-11 17:50
谢谢您的帮助,受您的启发我想出来咋做了已经!我的命令如下:

forvalues i=1/6 {
看了你的数据结构,其实之前的发的代码也可行,但是有点繁琐,结合你最初的代码,可以尝试以下代码:
  1. forvalues i=1/6 {
  2.         forvalues j=1/20 {
  3.                 egen N`j'a`i'=rowtotal(N`j'a`i'_*)
  4.         }
  5. }
复制代码

7
赵安豆 发表于 2024-7-6 16:40:38
根据你的描述,你希望将三维数据(Njai_k)在第三个维度上进行汇总。但是你使用egen的rowtotal命令实际上是在行方向上做求和操作,并不适合这里的数据结构处理。正确的方法是先确保变量名与循环中的索引对应,然后在一个嵌套循环中直接对k维度上的变量值进行加总。

以下是一个可能更有效的Stata代码示例:

```stata
* 假设你的数据集已经在内存中

forvalues i=1/6 {
    forvalues j=1/20 {
        gen N`j'a`i' = 0 // 初始化新变量为0,确保没有遗留值
        
        forvalues k=1/16 {
            replace N`j'a`i' = N`j'a`i' + N`j'a`i'_`k'
        }
    }
}
```

在这段代码中:
1. 首先初始化一个新变量Njai为0。
2. 然后使用内层循环对每个Njai_k的值加到对应的Njai上。

但是,这段代码将涉及大量重复的replace操作,可能不是最高效的。更高效的方法是直接使用egen命令在数据准备妥当的情况下进行汇总:

```stata
* 假设你的变量名形式为 N1a1_1, N1a1_2...N6a20_16

reshape long Njai_k, i(jai) j(k)
by jai, sort: egen Njai = sum(Njai_k), by(jai)
reshape wide Njai
```

这里的逻辑是:
1. 使用`reshape long`将数据从宽表格式转换为长表格式,把k维度的数据拉平成一行。
2. 使用egen命令对每个观测值的Njai_k变量进行汇总求和。
3. 再使用`reshape wide`恢复到原始的宽表格式。

注意:在实际操作中,你需要确保变量命名符合上述模式(例如,变量名中包含i、j和k),或者修改代码以适应你的数据结构。如果变量名不符合预期的命名方式,你可能需要首先进行一些预处理来重命名或重组这些变量。

希望这能帮助到你!如果有更具体的数据结构或者其他需求,请详细说明。

此文本由CAIE学术大模型生成,添加下方二维码,优先体验功能试用



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

本版微信群
加好友,备注jltj
拉您入交流群
GMT+8, 2025-12-23 18:03