楼主: lpw3582288
4273 20

[面板数据求助] 如何将一列数中与上一个数之差小于4的数变为上一个数 [推广有奖]

  • 1关注
  • 4粉丝

学前班

博士生

37%

还不是VIP/贵宾

-

威望
0
论坛币
18 个
通用积分
11.0119
学术水平
6 点
热心指数
7 点
信用等级
5 点
经验
13353 点
帖子
240
精华
0
在线时间
295 小时
注册时间
2013-7-6
最后登录
2022-5-2

楼主
lpw3582288 发表于 2014-5-25 15:17:50 |AI写论文
70论坛币
想实现这个功能不知道怎么编有a、b、c、d、e、f等等按照从小到大排列的一列数
如图所示

a
b
c
d
e
f
h
首先比较第一个数与第二个数的差,即上图的 a与b的差
如果a-b》4 不用做任何处理 直接开始比较第二个数与第三个数的差(为上图的b与c的差比较规则同第一个数与第二个数的比较规则)

如果a-b<4 用a替换掉b 数据变为
a
a
c
d
e
f
h


然后接着比较第二个数与第三个数的差(此时第二个数被替换为a 所以比较的是a与c的差,规则同第一个数与第二个数比较)
然后循环比较完整个数列的值完成全部需要替换的数。

QQ截图20140525153928.png

这个是自己写的code 一直跑不出来结果不知道那错了 求指点
var6就是要处理的那列向量的名字
week是我自己重新设定的一个矩阵
use e4,clear
mat week=[38637]
local total=_N
forval i = 1/·total‘{
preserve
sort Date
local b= week[`i',1]
local a = var6[`i+1']

if `a'-`b'<4{
mat week=[week \ `a']
}
else{
mat week=[week \ `b']
}
restore
}
关键词:ABCD 从小到大 如图所示 不知道 CDE 如图所示 如何

回帖推荐

ywh19860616 发表于16楼  查看完整内容

沙发
ywh19860616 发表于 2014-5-25 15:17:51
  1. clear
  2. input var
  3. 8
  4. 3
  5. 1
  6. 2
  7. 6
  8. 5
  9. 3
  10. end

  11. local i=2
  12. while `i'<=7 {
  13. local j=`i'-1
  14. if (var[`j']-var[`i']<4) {
  15. replace var=var[`i'-1] in `i'
  16. }
  17. else {
  18. display `"`Not changed'"'
  19. }
  20. local i=`i'+1
  21. }
  22. list
复制代码
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
lpw3582288 + 1 + 1 + 1 精彩帖子

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

一份耕耘,一份收获。

藤椅
lpw3582288 发表于 2014-5-25 15:43:24
急求。。。还会酌情追加  如果没有看懂或者觉得我表述不清楚 麻烦您问我下 我尽力表达清楚麻烦了!

板凳
xupengswordsman 发表于 2014-5-25 15:44:28
我来看看吧
xupeng

报纸
xupengswordsman 发表于 2014-5-25 16:01:23
lpw3582288 发表于 2014-5-25 15:43
急求。。。还会酌情追加  如果没有看懂或者觉得我表述不清楚 麻烦您问我下 我尽力表达清楚麻烦了!
x<-c(1,2,3,4)
for(i in 2:length(x)){
  if((x[i-1]-x)<4){
    x<-x[i-1]
  }else{   
    i<-i+1
  }
}
x
已有 2 人评分经验 学术水平 热心指数 信用等级 收起 理由
crystal8832 + 10 + 1 + 1 热心帮助其他会员
lpw3582288 + 1 + 1 + 1 精彩帖子

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

xupeng

地板
xupengswordsman 发表于 2014-5-25 16:02:10
  1. x<-c(1,2,3,4)
  2. for(i in 2:length(x)){
  3.   if((x[i-1]-x[i])<4){
  4.     x[i]<-x[i-1]
  5.   }else{   
  6.     i<-i+1
  7.   }
  8. }
  9. x
复制代码
已有 2 人评分经验 论坛币 学术水平 热心指数 信用等级 收起 理由
crystal8832 + 10 + 10 + 1 + 1 热心帮助其他会员
lpw3582288 + 1 + 1 + 1 热心帮助其他会员

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

xupeng

7
xupengswordsman 发表于 2014-5-25 16:03:24
我用的是R软件 你只要把x列向量变化一下 就可以输出你想要的结果了
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
lpw3582288 + 1 + 1 + 1 热心帮助其他会员

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

xupeng

8
xupengswordsman 发表于 2014-5-25 16:08:00
一个简化版本
  1. x<-c(1,2,3,4,-50,20,10)
  2. for(i in 2:length(x)){
  3.   if((x[i-1]-x[i])<4) x[i]<-x[i-1]
  4.   else i<-i+1
  5. }
  6. x
复制代码
输出结果 1   1   1   1 -50 -50 -50
xupeng

9
lpw3582288 发表于 2014-5-25 16:10:53
xupengswordsman 发表于 2014-5-25 16:03
我用的是R软件 你只要把x列向量变化一下 就可以输出你想要的结果了
十分感谢~ 电脑里面没有装R 并且stata基础比较差。。。不知道怎么给转换过去来着
我自己也写了段代码 但是发现跑出来的结果不对,能麻烦您帮我看看不 十分感谢!
var6就是要处理的那列向量的名字
week是我自己重新设定的一个矩阵
use e4,clear
mat week=[38637]
local total=_N
forval i = 1/·total‘{
preserve
sort Date
local b= week[`i',1]
local a = var6[`i+1']

if `a'-`b'<4{
mat week=[week \ `a']
}
if `a'-`b'>=4{
mat week=[week \ `b']
}
restore
}

10
lpw3582288 发表于 2014-5-25 16:19:36
xupengswordsman 发表于 2014-5-25 16:08
一个简化版本输出结果 1   1   1   1 -50 -50 -50
这个结果不应该是 1 1 1 1 -50 20 10吗??

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

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