【问题标题】:Create a Matrix using different Dataframe in R在 R 中使用不同的数据框创建矩阵
【发布时间】:2018-03-20 18:15:47
【问题描述】:

我在下面提到了 R 中的四个数据框:

DF_1

ID      Date
123     18/03/2018 16:45
456     10/03/2018 20:15

DF_2

ID      Date1                  Date2
123     2018-03-18 06:37:22    1519109133704
123     2018-03-18 06:37:21    1520324827462
123     2018-03-16 04:03:01    1520690354458
456     2018-03-10 14:46:03    1517319313151
456     2018-03-10 14:46:04    1515143046429
456     2018-03-10 14:46:03    1515838021062
456     2018-03-10 14:46:15    1488092209241

DF_3

ID      Date1                  Date2
123     2018-03-18 06:37:22    1519109133704
123     2018-03-18 06:37:21    1520324827462
123     2018-03-16 04:03:01    1520690354458
456     2018-03-10 14:46:03    1517319313151
456     2018-03-10 14:46:03    1515838021062
456     2018-03-10 14:46:15    1488092209241

DF_4

ID      Date1                  Date2
123     2018-03-18 06:37:22    1519109133704
123     2018-03-18 06:37:21    1520324827462
456     2018-03-10 14:46:03    1517319313151
456     2018-03-10 14:46:04    1515143046429

使用上面的数据框我想创建下面提到的矩阵:

输出:

                         DF_2                               DF_3                    DF_4
ID   Date         Date1  Total  Month Avg Day Last5  Date1  Total  Month Avg Day Last5 Date1  Total  Month Avg   Day Last5
123  18/03/2018
456  10/03/2018

我在下面提到了 6 个值 w.r.t DF_2、DF_3 和 DF_4。

  1. Date1 = 考虑 DF_1 的 Date 不同数据帧中同一日期的行数(这里我们将 Date1 用于所有数据帧(DF_2、DF_3 和 DF_4))。
  2. 总计 = 所有其他数据帧(即 DF_2、DF_3 和 DF_4)中每个 ID 的总行数
  3. 月份 = 根据所有其他数据帧(即 DF_2、DF_3 和 DF_4)的 Date2 计算月份数
  4. Avg = 每月平均行数(考虑 Date2)。
  5. 天 = 每天的平均行数(考虑 Date2)。
  6. Last5 = 过去五天的行数(考虑 Date1 与当前 sys.date() 的比较)

我有一个大数据框,所以我不能在这里使用 dput(),希望你们能清楚地理解。

【问题讨论】:

  • 你试过什么代码?你能把你的例子简化得更具体吗?您可能会更幸运地得到回复。

标签: r dataframe dplyr data.table tidyr


【解决方案1】:

您的问题令人困惑。如果你能把它说得更清楚,你会得到更好的答案。我会尽量根据我的理解来帮助你。

  • 为什么你有 3 种不同格式的日期。首先将所有日期设为相同的格式。

    我将展示一个 DF_2 的示例

     library(tidyverse)
     library(lubridate)
     DF_2 <- tibble(ID = c(123L, 123L, 123L, 456L, 456L, 456L, 456L), 
                    Date1 = c("2018-03-18 06:37:22", "2018-03-18 06:37:21", "2018-03-16 04:03:01", 
                     "2018-03-10 14:46:03", "2018-03-10 14:46:04", "2018-03-10 14:46:03", 
                     "2018-03-10 14:46:15"), 
                    Date2 = c(1519109133704, 1520324827462, 1520690354458, 1517319313151, 1515143046429, 1515838021062, 1488092209241)
                   )
    
     DF_2 <- DF_2 %>% mutate(Date1 = ymd_hms(Date1), 
                             Date2 = as.POSIXct(Date2/1000,origin = "1970-01-01")) 
    
     DF_2_tab <- DF_2 %>% group_by(ID) %>% summarise(date1 = sum(date(Date1)==date(DF_1$Date1[DF_1$ID==ID])),
                                Total = n(), 
                                Month = month(which date do you want to use here as you need to get a single number),
                                Day = day(not clear from your description as you need to get a single number for each id as above),
                                Last5 = sum( (Sys.Date()-date(Date1)) < 5 )
                                )
    

现在您对所有数据帧执行相同的操作,然后使用left_join 将所有数据帧通过ID 合并。

希望有帮助!

【讨论】:

  • Month 中,我想根据Date2Avg 计算月数平均每月行数(即,如果我的月数为3,并且基于@ 的行数为90 987654327@ 比我的Avg 是 30)。和 Day 对于每天创建的行,就像前面的示例一样,它将是 1。
  • 请帮帮我。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-13
相关资源
最近更新 更多