r - 识别连续出现并合并两个数据帧

标签 r dataframe ggplot2 matrix

This question relates to one posted earlier.

我有 2 个要合并的 data.frames。这两个 data.frames 具有不同的大小(例如 dim (df1) =16533, 580 和 dim(df2) = 2820 , 675`)。

记录是由不同的人/群体在不同的日子制作的。

来自 df1 的变量

  • Index = 记录的人组(例如,它可以代表 1 人或 2 或更多)
  • id1 = 录制组中的人(例如 12 1 = 组 12 person 1; 12 2 = group 12 person 2, etc . )
  • id2 = 记录的第一天或第二天 (eg. 12 1 1 = group 12, person 1, 1 day; 12 1 2 = group 12, person 1, 2 day;)
  • Day = 进行日记记录的工作日(例如 12 1 1 Wednesday =group 12, person 1, day 1, weekday Wednesday; 12 1 2 Sunday = group 12, person 1, day 1 , weekday Sunday )

    这些变量后跟 24h observations
  • obs1_1-obs1_144=primary observationobs2_1-obs2_144=secondary observationsobs3_1-obs3_144=tertiary observationsobs4_1-obs4_144=quarterly observations
    示例
    df1
    
    index id1 id2  Day           obs1_1...obs1_144....obs2_1...obs2_144...obs3_1...obs3_144...obs4_1...obs4_144
     12    1   1   Wednesday    1      11          12
     12    1   2   Sunday       2      0           0
    123    1   1   Tuesday      1      0           1
    123    1   2   Saturday     3      0           3
    123    2   1   Monday       2      2           4
    123    2   2   Saturday     1      0           8
    

    df2 中,仅根据索引和 id1 记录了观察结果。每人只有一次观察。类似地,这里还有一个 Day 变量,用于记录录制开始的时间(例如,不是录制当天)。例如,这里的 id 12 1 星期二表示第 12 个人 1 组从星期二开始记录观察结果。

    一周分为:
               Monday = 95 variables starting from day11-day196 
    (in the actual data t0400_0415_d1-t0345_0400_d1)
                Tuesday = 95 variables starting day21-day296 
        (in the actual data t0400_0415_d2-t0345_0400_d2)
                Wednesday = 95 variables starting day31-day396
        (in the actual data t0400_0415_d3-t0345_0400_d3)
                Thursday = 95 variables starting day41-day496
        (in the actual data t0400_0415_d4-t0345_0400_d4)
                Friday = 95 variables starting day51-day596
        (in the actual data t0400_0415_d5-t0345_0400_d5)
                Saturday = 95 variables starting day61-day696
        (in the actual data t0400_0415_d6-t0345_0400_d6)
                Sunday = 95 variables starting day71-day796
        (in the actual data t0400_0415_d7-t0345_0400_d7)
    
    df2 示例
    index   id1  Day       day11 day12 day13 day14 day15 day16  day17  .....day196......day796
     12      1    Tuesday     2    1    2    1    1    3    1    
    123      1    Friday      0    3    0    3    3    0    3  
    

    我想确定 df2 中与 df1 同一天记录的观察结果。

    我的目标是:
  • df2 识别连续记录(每日记录之间没有间隔)。例如,连续记录将是:记录从星期二开始,并且在星期三、星期四、星期五有记录。这被称为连续三个记录。如果记录在星期二开始并且在星期三和星期五有记录,则将是非连续记录。由于存在间隔日,因此这是非连续记录。
  • df1 我想确定连续记录的人的索引和 id1 以及记录在连续观察中的位置(例如,在连续 3 次观察中,观察可能落在第 1,2 或 3 天) Post related to one of my question

  • 结果:
     index id1 id2   obs1 obs2 obs3 
     12      1   1     1   11    12   
     12      1   2     2    0     0
     123     1   2     3    0     3        
     123     2   2     1    0     8
    

    样本数据

    df1:
    structure(list(index = c(12, 12, 123, 123, 123, 123), id1 = c(1, 
    1, 1, 1, 2, 2), id2 = c(1, 2, 1, 2, 1, 2), Day = structure(c(5L, 
    3L, 4L, 2L, 1L, 2L), .Label = c("Monday", "Saturday", "Sunday", 
    "Tuesday", "Wednesday"), class = "factor"), obs1 = c(1, 2, 1, 
    3, 2, 1), obs2 = c(11, 0, 0, 0, 2, 0), obs3 = c(12, 0, 1, 3, 
    4, 8)), class = "data.frame", row.names = c(NA, -6L))
    

    df2:
      structure(list(index = c(12, 123), id1 = c(1, 1), Day = structure(2:1, .Label = c("Friday", 
        "Tuesday"), class = "factor"), day1 = c(2, 0), day2 = c(1, 3), 
            day3 = c(2, 0), day4 = c(1, 3), day5 = c(1, 3), day6 = c(3, 
            0), day7 = c(1, 3)), class = "data.frame", row.names = c(NA, 
        -2L))
    

    最佳答案

    我们可以通过 Map 做到这一点创建键/值 named向量,然后与列名进行匹配

    lst1 <- Map(`:`, seq(11, 71, by = 10), seq(196, 796, by = 100))
    names(lst1) <- c('Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday')
    out <- stack(lst1)[2:1]
    out$values <- paste0('day', out$values)
    

    -检查
    setNames(as.character(out$ind), out$values)[c('day41', 'day182', 'day242', 'day724')]
    #   day41    day182    day242    day724 
    # "Monday"  "Monday" "Tuesday"  "Sunday" 
    

    关于r - 识别连续出现并合并两个数据帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61176058/

    相关文章:

    r - 在直方图中添加一条线

    python - 如何在 Plotly 中为瀑布图添加总值列

    python - 从 pandas 字典字典中制作数据帧字典

    r - 在 R 中使用 ggplot 在绘图上绘制形状?

    r - R中的堆积面积直方图

    R 在法线轴上绘制逻辑变换数据(逻辑变换)

    r - 使用 Caret 在 R 中为 k-fold CV 创建折叠

    r - 查找向量元素中第一次变化的索引

    pandas - 有没有一种简单的方法可以对 Pandas DataFrame 中的列进行分组?

    r - 作为二进制变量处理