楼主: dxystata
2257 3

[编程问题求助] 根据频率大小赋值 [推广有奖]

版主

已卖:302份资源

大师

37%

还不是VIP/贵宾

-

TA的文库  其他...

Software

中英文Ebook

R学习

威望
2
论坛币
183395 个
通用积分
15333.1475
学术水平
208 点
热心指数
271 点
信用等级
174 点
经验
298627 点
帖子
5586
精华
1
在线时间
13632 小时
注册时间
2006-6-21
最后登录
2025-12-22

初级学术勋章 初级热心勋章 中级热心勋章 初级信用勋章

楼主
dxystata 发表于 2013-11-27 12:53:28 |AI写论文
100论坛币
数据集为
var1
AB
AB
AA
BB
AA
BB
AB
AA
AA
AB
BB


类似的变量很多,希望编程实现,要求将字母不同的设为1,字母相同的令频数多或频率大的设为0,另一个设为2
var1 var2
AB     1
AB     1
AA     0
BB     2
AA     0
BB     2
AB     1
AA     0
AA     0
AB     1
BB     2


谢谢!

最佳答案

bbs0805 查看完整内容

在指定变量的行中输入要赋值的变量名,然后执行以下程序: local var "var1 var2" //指定变量 foreach v of var `var' { tempvar v1 v2 freq no gen `v1'=substr(`v',1,1) gen `v2'=substr(`v',2,1) gen n`v'=2 replace n`v'=1 if `v1'!=`v2' gen `no'=_n sort `v' bysort `v': gen `freq'=_N quietly sum `freq' local max=r(max) repl ...
关键词:VaR 数据集 字母

本帖被以下文库推荐

沙发
bbs0805 发表于 2013-11-27 12:53:29
在指定变量的行中输入要赋值的变量名,然后执行以下程序:

local var "var1 var2"       //指定变量
foreach v of var `var' {
      tempvar v1 v2 freq no
      gen `v1'=substr(`v',1,1)
      gen `v2'=substr(`v',2,1)
      gen n`v'=2
      replace n`v'=1 if `v1'!=`v2'
      gen `no'=_n
      sort `v'
      bysort `v': gen `freq'=_N
      quietly sum `freq'
      local max=r(max)
      replace n`v'=0 if `freq'==`max' & n`v'!=1
      sort `no'
}

执行后的结果如下:
var1  var2 nvar1 nvar2
AB    AA     1       2
AB    AB     1       1
AA    BB     0       0
BB    CC      2       0
AA    BC     0       1
BB    BB     2       0
AB    CC     1       0
AA    BC     0       1
AA    BB     0       0
AB    CC     1       0
BB    BC     2       1

已有 1 人评分经验 学术水平 热心指数 收起 理由
dxystata + 20 + 1 + 1 好的意见建议

总评分: 经验 + 20  学术水平 + 1  热心指数 + 1   查看全部评分

藤椅
dxystata 发表于 2013-11-27 22:22:49
bbs0805 发表于 2013-11-27 21:39
在指定变量的行中输入要赋值的变量名,然后执行以下程序:

local var "var1 var2"       //指定变量
foreach v of var `var' {
      tempvar v1 v2 freq no
      gen `v1'=substr(`v',1,1)
      gen `v2'=substr(`v',2,1)
      gen n`v'=2
      replace n`v'=1 if `v1'!=`v2'
      gen `no'=_n
      sort `v'
      bysort `v': gen `freq'=_N
      quietly sum `freq'
      local max=r(max)
      replace n`v'=0 if `freq'==`max' & n`v'!=1
      sort `no'
}

执行后的结果如下:
var1  var2 nvar1 nvar2
AB    AA     1       2
AB    AB     1       1
AA    BB     0       0
BB    CC      2       0
AA    BC     0       1
BB    BB     2       0
AB    CC     1       0
AA    BC     0       1
AA    BB     0       0
AB    CC     1       0
BB    BC     2       1
如何自动给新产生的变量label values呢?

板凳
bbs0805 发表于 2013-11-28 09:53:02
dxystata 发表于 2013-11-27 22:22
如何自动给新产生的变量label values呢?
在原程序基础上直接添加红字部分:
local var "var1 var2"       //指定变量
foreach v of var `var' {
        tempvar v1 v2 freq no
        gen `v1'=substr(`v',1,1)
        gen `v2'=substr(`v',2,1)
        gen n`v'=2
        replace n`v'=1 if `v1'!=`v2'
        gen `no'=_n
        bysort `v': gen `freq'=_N
        quietly sum `freq'
        local max=r(max)
        replace n`v'=0 if `freq'==`max' & n`v'!=1
        sort `no'


      preserve
          tempvar n
          bysort `v' n`v':gen `n'=_n
          keep if `n'==1
          local N=_N
          forvalue i=1/`N' {
               local lab=`v'[`i']
               local val=n`v'[`i']
               local labval`v'=`"`labval`v'' `val'  "`lab'""'
         }
     restore
     label define l`v' `labval`v''
     label value n`v' l`v'

}
结果如下:
2013-11-28_095159.jpg
由于对应变量var2中BB和CC在nvar2中的值都取0,因此建立数值标签后均显示为cc
已有 3 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
Sunknownay + 3 + 3 + 3 热心帮助其他会员
dxystata + 40 好的意见建议
ywh19860616 + 3 + 3 + 3 好的建议

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

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

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