【问题标题】:Assigning events to calender dates in R在 R 中将事件分配给日历日期
【发布时间】:2017-11-19 10:04:22
【问题描述】:

这是为我的实验创建抽样设计。我想在 2018 年的每个星期一调查 8 个不同的人。我调查他们的顺序需要在每个星期一是随机的。例如。 A,B,C,D... 一个星期一,然后是下一个 C,B,A,D....

要尝试使用 R,我有一个名称列表:namelist<- ("A", "B", "C",...),其中包含 8 个不同的名称。我想将这些随机分配给一年中的每个星期一。为此,我创建了 2018 年全年的日期列表。X<- ("01-01-2018", "02-01-2018",...) 和相应工作日列表 Y<- ("Monday", "Tuesday",...)

我需要为一年中的所有星期一随机分配整个名单。最好的方法是什么?我可以为此使用for循环吗?还是有其他方法可以做到这一点?

【问题讨论】:

    标签: r datetime random sampling experimental-design


    【解决方案1】:

    您可以在for 循环中使用sample() 函数从您的姓名列表中随机抽样到数据框中:

    获取一年中的所有星期一并创建名单:

    dates = as.Date("2018-01-01") +7*(0:52)
    namelist = c("A","B","C","D","E","F","G","H")
    

    您尚未指定希望输出的外观,但这里有两个选择:

    多列方法:

    samples=matrix(0,length(dates),length(namelist))
    for(i in 1:length(dates)){samples[i,]=sample(namelist)}
    df=data.frame(dates,samples)
    
    > head(df)
           dates X1 X2 X3 X4 X5 X6 X7 X8
    1 2018-01-01  E  G  B  D  H  C  A  F
    2 2018-01-08  F  D  B  C  G  H  A  E
    3 2018-01-15  A  E  H  D  B  C  G  F
    4 2018-01-22  E  C  F  H  A  D  G  B
    5 2018-01-29  C  E  F  B  G  H  A  D
    6 2018-02-05  C  G  A  H  D  F  B  E
    

    单列方法:

    df2 = data.frame(dates, samples_char="")
    for(i in 1:nrow(df2)){df2[i,'samples_char']=paste0(sample(namelist),collapse=", ")}
    
    > head(df2)
           dates           samples_char
    1 2018-01-01 E, A, G, D, C, B, F, H
    2 2018-01-08 B, E, F, A, C, H, G, D
    3 2018-01-15 H, D, E, C, F, A, G, B
    4 2018-01-22 G, F, A, D, E, H, C, B
    5 2018-01-29 A, E, D, H, G, C, B, F
    6 2018-02-05 C, H, G, F, E, B, D, A
    

    【讨论】:

    • 谢谢。多列方法有效。但是,对于单列方法,我收到以下错误。在[<-.factor(*tmp*, iseq, value = "F, D, E, H, G, C, B, A") 中:无效的因子水平,NA 生成。
    • 谢谢。多列方法有效。但是,对于单列方法,我收到以下错误。 [<-.factor(*tmp*, iseq, value = "F, D, E, H, G, C, B, A") : 无效的因子水平,NA 生成。>
    • 是否可以在不提取星期一的情况下执行此操作,因为我想为每个工作日针对不同的名单执行类似的循环?
    【解决方案2】:
    #I have figured this out. Thank you#
      ##Create calender and list of names for Group01, empty variable for random order and make a dataframe##
    Startdate<- as.Date("2017-12-4")
    Date<-Startdate + 0:365
    Day<-weekdays(FullCalendar)
    MONTHS<-months(FullCalendar)
    Focal_Order<-""
    Group<- ""
    Focal_Calender<-data.frame(Date, Day, Group, Focal_Order , stringsAsFactors 
    = FALSE)
    head(Focal_Calender)
    Group01<- c("A", "B", "C", "D", "E", "F", "G", "H")
    ## Use For  loop to assign random order to every Monday ##
    for(i in 1:nrow(Focal_Calender) ){
      if(Focal_Calender[i,2]=='Monday'){
      Focal_Calender[i,'Focal_Order']=paste0(sample(Group01),collapse=", ")
      Focal_Calender[i,'Group']=paste0("Group 01")}
      else {}
    }
    head(Focal_Calender)
    Focal_Calender
    write.csv(Focal_Calender, file = "Focal_Calender.csv",row.names=FALSE, 
    na="")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多