【问题标题】:Error in data.table when use lubridate::period in r在 r 中使用 lubridate::period 时 data.table 出错
【发布时间】:2020-07-16 00:25:56
【问题描述】:
library(data.table)
library(lubridate)
x <- new("Period", .Data = c(29, 6, 48, 10, 44, 35, 52, 0, 29, 47, 
30, 51, 3, 12, 11, 49, 59, 48, 23, 44, 8, 44, 9, 15, 19, 6, 14, 
59, 29, 20, 15, 50, 0, 10, 7, 49, 26, 24, 45, 18, 48, 36, 28, 
50, 40, 50, 19, 51, 8, 34, 45, 59, 27, 0, 5, 52, 5, 30, 14, 41, 
49, 48, 20, 7, 6, 11, 35, 4, 8, 6, 0, 0, 44, 13, 44, 31, 27, 
26, 49, 10, 5, 7, 26, 38, 0, 0, 42, 24, 52, 23, 15, 13, 59, 30, 
7, 52, 32, 27, 15, 54, 13, 19, 8, 33, 3, 47, 26, 42), year = c(0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0), month = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0), day = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), hour = c(1, 14, 
0, 3, 7, 10, 6, 0, 0, 2, 4, 1, 0, 5, 7, 14, 10, 0, 13, 3, 1, 
7, 11, 8, 0, 14, 9, 14, 18, 0, 0, 8, 0, 10, 0, 6, 14, 7, 0, 20, 
8, 12, 0, 0, 0, 0, 14, 13, 17, 14, 8, 0, 15, 0, 12, 0, 13, 16, 
5, 0, 6, 9, 7, 0, 6, 15, 1, 16, 13, 13, 0, 0, 7, 5, 16, 0, 13, 
0, 0, 3, 18, 16, 7, 0, 0, 14, 4, 4, 0, 10, 2, 10, 13, 0, 22, 
1, 18, 3, 15, 14, 10, 0, 23, 7, 2, 0, 7, 1), minute = c(5, 6, 
53, 40, 0, 30, 18, 0, 4, 43, 55, 16, 6, 0, 35, 45, 37, 19, 14, 
44, 12, 1, 43, 37, 22, 52, 6, 36, 46, 11, 30, 44, 0, 23, 5, 52, 
57, 7, 49, 8, 58, 25, 46, 24, 5, 14, 34, 50, 53, 31, 10, 5, 30, 
0, 29, 0, 43, 18, 3, 8, 20, 39, 56, 1, 50, 51, 41, 5, 51, 28, 
0, 0, 23, 0, 15, 0, 40, 49, 2, 3, 25, 47, 55, 1, 0, 40, 40, 32, 
21, 58, 41, 55, 45, 12, 44, 12, 15, 30, 58, 6, 40, 13, 40, 59, 
48, 11, 41, 25))

我有一个 x 周期向量,如下所示

x
  [1] "1H 5M 29S"     "14H 6M 6S"     "53M 48S"       "3H 40M 10S"    "7H 0M 44S"     "10H 30M 35S"   "6H 18M 52S"    "0S"           
  [9] "4M 29S"        "2H 43M 47S"    "4H 55M 30S"    "1H 16M 51S"    "6M 3S"         "5H 0M 12S"     "7H 35M 11S"    "14H 45M 49S"  
 [17] "10H 37M 59S"   "19M 48S"       "13H 14M 23S"   "3H 44M 44S"    "1H 12M 8S"     "7H 1M 44S"     "11H 43M 9S"    "8H 37M 15S"   
 [25] "1d 0H 22M 19S" "14H 52M 6S"    "9H 6M 14S"     "14H 36M 59S"   "18H 46M 29S"   "11M 20S"       "30M 15S"       "8H 44M 50S"   
 [33] "0S"            "10H 23M 10S"   "5M 7S"         "6H 52M 49S"    "14H 57M 26S"   "7H 7M 24S"     "49M 45S"       "20H 8M 18S"   
 [41] "8H 58M 48S"    "12H 25M 36S"   "46M 28S"       "24M 50S"       "5M 40S"        "14M 50S"       "14H 34M 19S"   "13H 50M 51S"  
 [49] "17H 53M 8S"    "14H 31M 34S"   "8H 10M 45S"    "5M 59S"        "15H 30M 27S"   "0S"            "12H 29M 5S"    "52S"          
 [57] "13H 43M 5S"    "16H 18M 30S"   "5H 3M 14S"     "8M 41S"        "6H 20M 49S"    "9H 39M 48S"    "7H 56M 20S"    "1M 7S"        
 [65] "6H 50M 6S"     "15H 51M 11S"   "1H 41M 35S"    "16H 5M 4S"     "13H 51M 8S"    "13H 28M 6S"    "0S"            "0S"           
 [73] "7H 23M 44S"    "5H 0M 13S"     "16H 15M 44S"   "31S"           "13H 40M 27S"   "49M 26S"       "2M 49S"        "3H 3M 10S"    
 [81] "18H 25M 5S"    "16H 47M 7S"    "7H 55M 26S"    "1M 38S"        "0S"            "14H 40M 0S"    "4H 40M 42S"    "4H 32M 24S"   
 [89] "21M 52S"       "10H 58M 23S"   "2H 41M 15S"    "10H 55M 13S"   "13H 45M 59S"   "12M 30S"       "22H 44M 7S"    "1H 12M 52S"   
 [97] "18H 15M 32S"   "3H 30M 27S"    "15H 58M 15S"   "14H 6M 54S"    "10H 40M 13S"   "13M 19S"       "23H 40M 8S"    "7H 59M 33S"   
[105] "2H 48M 3S"     "11M 47S"       "7H 41M 26S"    "1H 25M 42S"

但是它不适用于 data.table 但它适用于 data.frame 问题是什么,解决方案是什么。

data.table(time = x)
data.frame(time = x)

Error in dimnames(x) <- dn : length of 'dimnames' [1] not equal to array extent

【问题讨论】:

    标签: r data.table lubridate


    【解决方案1】:

    这是造成问题的属性。如果我们可以转换为character,它会工作

    data.table(time = as.character(x))
    

    或者另一种选择是创建一个list 列

    data.table(time = list(x)) 
    

    或者要获取组件,可以使用@

    data.table(.Data = x@.Data, year = x@year, month = x@month, 
          day = x@day, hour = x@month, minute = x@minute)
    

    或者创建一个tibble

    library(tibble)
    tibble(x)
    

    【讨论】:

    • 问题是当转换为 x 类型字符时不允许正确排序sort(x) == sort(as.character(x)) 如果我需要处理大数据,tibble 比 data.table 慢得多
    • @RafaelDíaz data.table 不兼容,无法按列创建此类。你能在 github data.table 中请求吗
    【解决方案2】:

    如果您想稍后对该列进行数学运算,可以尝试转换为 as.duration。

    data.table(as.duration(x))
                            V1
      1:   3929s (~1.09 hours)
      2:  50766s (~14.1 hours)
      3: 3228s (~53.8 minutes)
      4:  13210s (~3.67 hours)
      5:  25244s (~7.01 hours)
     ---                      
    104:  28773s (~7.99 hours)
    105:   10083s (~2.8 hours)
    106: 707s (~11.78 minutes)
    107:  27686s (~7.69 hours)
    108:   5142s (~1.43 hours)
    

    【讨论】:

      【解决方案3】:

      这是在 data.table 中表示该信息的一种方法

      as.data.table(lapply(setNames(slotNames(x), slotNames(x)), slot, object = x))
      #      .Data year month day hour minute
      #   1:    29    0     0   0    1      5
      #   2:     6    0     0   0   14      6
      #   3:    48    0     0   0    0     53
      #   4:    10    0     0   0    3     40
      #   5:    44    0     0   0    7      0
      #  ---                                 
      # 104:    33    0     0   0    7     59
      # 105:     3    0     0   0    2     48
      # 106:    47    0     0   0    0     11
      # 107:    26    0     0   0    7     41
      # 108:    42    0     0   0    1     25
      

      【讨论】:

      • 问题是,如果我有多个变量,这种结构不允许按时间变量对数据进行排序。
      猜你喜欢
      • 2016-09-02
      • 2021-04-05
      • 1970-01-01
      • 2017-10-18
      • 1970-01-01
      • 2022-11-25
      • 1970-01-01
      • 2014-02-24
      • 1970-01-01
      相关资源
      最近更新 更多