首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将多个响应列表

将多个响应列表
EN

Stack Overflow用户
提问于 2017-01-27 15:10:36
回答 1查看 35关注 0票数 0

在一项提高农业实践视频传播质量的调查中,变量之一是在传播过程中讨论了哪些不可协商的实践。例如,小麦播种在其中提到了四种不容商量的做法。

我想创建一个变量,它根据所讨论的实践返回4、3、2或1。

我首先将所有字符串响应编码为numeric:

代码语言:javascript
复制
gen SWI_ST_NNG1=q205_1_1
replace SWI_ST_NNG1="0" if SWI_ST_NNG1=="#NULL!"
replace SWI_ST_NNG1="1" if SWI_ST_NNG1=="Luke warm water should be used for seed treatment"

gen SWI_ST_NNG2=q205_1_2
replace SWI_ST_NNG2="0" if SWI_ST_NNG2=="#NULL!"
replace SWI_ST_NNG2="2" if SWI_ST_NNG2=="Mixture of seed, Jaggery and cow urine should kept for"

gen SWI_ST_NNG3=q205_1_3
replace SWI_ST_NNG3="0" if SWI_ST_NNG3=="#NULL!"
replace SWI_ST_NNG3="3" if SWI_ST_NNG3=="Use of bavistin powder is must for seed treatment"

gen SWI_ST_NNG4=q205_1_4
replace SWI_ST_NNG4="0" if SWI_ST_NNG4=="#NULL!"
replace SWI_ST_NNG4="4" if SWI_ST_NNG4=="Seeds should be kept 12 to 15  hours for germination"
EN

回答 1

Stack Overflow用户

发布于 2017-01-27 19:28:44

我们需要一个沙箱来使事情变得清晰,因为您没有提供MCVE。请参阅https://stackoverflow.com/help/mcve

本质上,序列中的变量j的值要么是j (1到4),要么是0,我认为你应该对非零值进行计数()。(我不认为返回1到4有任何意义,因为如何从一个人编写1和3,而从另一个人编写4?)

使用变量间的循环可以很容易地完成计数。

代码语言:javascript
复制
clear
set obs 10 
set seed 2803 
forval j = 1/4 { 
    gen SWI_ST_NNG`j' = cond(runiform() < 0.5, `j', 0) 
} 

list, sep(0) 


     +-------------------------------------------+
     | SWI_ST~1   SWI_ST~2   SWI_ST~3   SWI_ST~4 |
     |-------------------------------------------|
  1. |        0          0          0          4 |
  2. |        1          0          0          0 |
  3. |        0          2          0          0 |
  4. |        1          2          3          4 |
  5. |        1          2          3          4 |
  6. |        1          2          3          0 |
  7. |        1          2          3          0 |
  8. |        0          2          3          4 |
  9. |        1          0          3          4 |
 10. |        1          2          3          0 |
     +-------------------------------------------+

gen count = 0 

quietly forval j = 1/4 { 
    replace count = count + (SWI_ST_NNG`j' > 0) 
}

list, sep(0)

     +---------------------------------------------------+
     | SWI_ST~1   SWI_ST~2   SWI_ST~3   SWI_ST~4   count |
     |---------------------------------------------------|
  1. |        0          0          0          4       1 |
  2. |        1          0          0          0       1 |
  3. |        0          2          0          0       1 |
  4. |        1          2          3          4       4 |
  5. |        1          2          3          4       4 |
  6. |        1          2          3          0       3 |
  7. |        1          2          3          0       3 |
  8. |        0          2          3          4       3 |
  9. |        1          0          3          4       3 |
 10. |        1          2          3          0       3 |
     +---------------------------------------------------+

有关逐行工作的更多信息,请参阅this discussion

在实践中,有一个方便的捷径:

代码语言:javascript
复制
egen count2 = anycount(SWI*), values(1/4) 

但是学习循环方法对于解决更复杂的问题是非常有用的。

请注意,如果您的编码变量只有1或0,那么您想要的计数就是行和,这很容易通过egen获得。这样的指示器(也称为dummy)变量对于大多数统计和数据管理目的是一种更好的编码。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41888591

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档