小编Dae*_*lus的帖子

有效地转换data.table中的日期列

我有一个包含许多列的大型数据集,其中包含两种不同格式的日期:

"1996-01-04" "1996-01-05" "1996-01-08" "1996-01-09" "1996-01-10" "1996-01-11"
Run Code Online (Sandbox Code Playgroud)

"02/01/1996" "03/01/1996" "04/01/1996" "05/01/1996" "08/01/1996" "09/01/1996"
Run Code Online (Sandbox Code Playgroud)

在这两种情况下,class()都是"character".由于数据集有很多行(450万),我正在寻找一种有效的data.table转换方法.现在,我使用这个自建功能:

convert_to_date <- function(in_array){
  tmp <- try(as.Date(in_array, format = "%d/%m/%Y"),TRUE)
  if (all(!is.na(tmp)) & class(tmp) != "try-error"){
    return(tmp)
  } else{
    tmp2 <- try(as.Date(in_array),TRUE)
    if (all(!is.na(tmp2)) & class(tmp2) != "try-error"){
      return(tmp2)
    } else{
      return(in_array)
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

然后我用它转换我需要的列(data.table DF)

DF[,date:=convert_to_date(date)]
Run Code Online (Sandbox Code Playgroud)

然而,这仍然非常缓慢(每列接近45s).

有没有办法通过data.table方法优化这个?到目前为止,我还没有找到更好的方法,所以我会感谢任何提示.

PS:为了更好的可读性,我将该函数"外包"到第二个文件并在我的主程序中获取它.这是否会对R中的计算速度产生(负面)重大影响?

r date data.table

8
推荐指数
1
解决办法
7754
查看次数

R data.table :(动态)前瞻性交叉连接

我想知道在data.table中是否有一个CJ()方法的选项来获取由评估条件形成的向量而不是运行完整的交叉连接.

数据

library(data.table)
df<-data.table(
  ID=c(18L,  18L,  18L,  46L,  74L,  74L, 165L, 165L), 
  cat=c(1300L, 1320L, 1325L, 1300L, 1300L, 1325L, 1300L, 1325L),
  low=c(24.625, 16.250, 14.500, 43.625, 58.250, 45.375, 90.750, 77.875),
  high=c(26.625, 17.500, 15.500, 45.625, 60.000, 47.375, 92.750, 79.875)
  )

df
    ID  cat    low   high
1:  18 1300 24.625 26.625
2:  18 1320 16.250 17.500
3:  18 1325 14.500 15.500
4:  46 1300 43.625 45.625
5:  74 1300 58.250 60.000
6:  74 1325 45.375 47.375
7: 165 1300 90.750 92.750
8: 165 1325 …
Run Code Online (Sandbox Code Playgroud)

r cross-join data.table

4
推荐指数
2
解决办法
104
查看次数

R:内插 + 外推边界 - 使用 data.table?

所以,我有以下问题:我有一个数据集 A(data.table 对象),其结构如下:

date days rate 1996-01-02 9 5.763067 1996-01-02 15 5.745902 1996-01-02 50 5.673317 1996-01-02 78 5.608884 1996-01-02 169 5.473762 1996-01-03 9 5.763067 1996-01-03 14 5.747397 1996-01-03 49 5.672263 1996-01-03 77 5.603705 1996-01-03 168 5.470584 1996-01-04 11 5.729460 1996-01-04 13 5.726104 1996-01-04 48 5.664931 1996-01-04 76 5.601891 1996-01-04 167 5.468961

请注意,天数列及其大小可能因每天而异。我现在的目标是(分段线性地)在几天内插入速率。我这样做的每一天通过

approx(x=A[,days],y=A[,rate],xout=days_vec,rule=2)
Run Code Online (Sandbox Code Playgroud)

where days_vec <- min_days:max_days,即我感兴趣的天数范围(比如 1:100)。

我在这里有两个问题:

  1. 大约只进行插值,即它不会在 min(x) 和 max(x) 之间创建线性拟合。如果我现在对 1:100 天感兴趣,我首先需要使用第 9 天和第 15 天(A 的前 2 行)通过以下方式手动完成:

    first_days …

interpolation r extrapolation data.table

0
推荐指数
1
解决办法
1325
查看次数

标签 统计

data.table ×3

r ×3

cross-join ×1

date ×1

extrapolation ×1

interpolation ×1