r语言按照行的情况合并数据

想要合并数据,数据情况大致如下

img


每个患者它包含多次数据(每个数据都有对映的日期),我想根据名字和日期,保留最旧日期的数据(即最靠下的数据),并且在该行数据中,如果有部分缺失,我想用该患者与最旧日期相同的那次检查的数据(即第二靠下的数据)做补充,以获得一个尽量全尽量旧的数据,但是不知道代码该怎么写,请问该用什么代码呢?

最旧的:min
空值:null 改成isnull非空
思路就是这样

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 你可以看下这个问题的回答https://ask.csdn.net/questions/735995
  • 你也可以参考下这篇文章:输入一维数组字符串,在输入一个字符串,获取字符串中,相同的字符,并且把相同的字符串输出
  • 除此之外, 这篇博客: 车间调度的编码,解码,调度方案可视化等一系列问题的初探中的 代码详解 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    编码:

    • 1、工序编码上的基因是工件号,重复出现的次数表示工件对应的第几道工序,加工次序依照编码次序。机器编码的基因是机器编号,编码首个基因是第一个工件的第一道工序的加工机器,加工时间的编码即是工件在机器上的加工时间。

    图

    如上面的编码表示工件1的第一道和第二道工序在机器1和4上加工,后面依次类推。
    如果需要工序编码随机生成,可以做如下操作:

    job=[1,1,1,2,2,3,3,4,4]
    np.random.shuffle(job)
    

    2、解码

    • 根据工序和机器编码转换出工序的加工时间,根据工序、机器和加工时计算每个机器的负载和终止时间。最大完工时间是最晚机器的终止时间。总负荷和总能耗分别是各机器的负荷和能耗之和,能耗根据空载和负载时间和具体的功率计算。

    解码的核心简单来说:安排一道工序的加工:1、需要找到该工序的的上一道工序的完工时间(当然,作为工件的第一道工序不用考虑),2、找到该工序的加工机器当前加工任务的完工时间。两者取最大值即可。核心代码如下:

    if(worktime[0,int(work[0,i])]>0):
    	startime=max(worktime[0,int(work[0,i])],tmm[0,j])
    	tmm[0,j]=startime+workmachinetime[0,i]										worktime[0,int(work[0,i])]=startime+workmachinetime[0,i]
    if(worktime[0,int(work[0,i])]==0):
    	startime=tmm[0,j]
    	tmm[0,j]=startime+workmachinetime[0,i]
    	worktime[0,int(work[0,i])]=startime+workmachinetime[0,i]
    

    startime、tmm、worktime、workmachinetime分别表示工序开工时间、机器完工时间、工件到当前工序的完工时间、工序在机器上的加工时间。Worktime等于0表示是工件的第一道工序。

    3、可视化(甘特图):

    • 甘特图(Gantt Chart),也叫做生产计划进度图,是当前大多数文献研究车间调度问题时结果的可视化方法[65]。甘特图中横轴是时间,纵轴是机器,其能够很清晰地表示出工件的工序的开工和完工时间,各台机器上的开工和完工时间也比较明了。

    解码时把各个工序的开工、加工、完工时间、加工等信息记录下来,画图也就比较容易。记录信息的代码如下:

    if(worktime[0,int(work[0,i])]>0):
    	startime=max(worktime[0,int(work[0,i])],tmm[0,j])
    	tmm[0,j]=startime+workmachinetime[0,i]
    	worktime[0,int(work[0,i])]=startime+workmachinetime[0,i]
    if(worktime[0,int(work[0,i])]==0):
    	startime=tmm[0,j]
    	tmm[0,j]=startime+workmachinetime[0,i]
    	worktime[0,int(work[0,i])]=startime+workmachinetime[0,i]
    tmmw[0,j]+=workmachinetime[0,i]
    break
    

    上面例子的信息及甘特图如下:

    图

    本文代码已经写好,只用自己在excel表输入编码即可,如果希望在代码里进行操作,在下面的位置进行手动输入,需要注意的是,工序、机器、加工时间编码的数据形式都是二维数组。

    if __name__=='__main__':
    	a,b,c,p1,p2,work_number,mach_number,scale_ls,index_ls,x1=getinformation()#x1是excel表的内容,可以print对照看
    	#a,b,c,p1,p2,work_number,mach_number分别是工序编码,机器编码,加工时间,工件数,机器数
    	print(a)
    
  • 您还可以看一下 李月喜老师的企业微信开发自建内部应用开发篇课程中的 开发文档如何阅读,如何寻求帮助,如何找到同行小节, 巩固相关知识点

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^