我有一个包含许多列的大型数据集,其中包含两种不同格式的日期:
"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中的计算速度产生(负面)重大影响?
我想知道在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) 所以,我有以下问题:我有一个数据集 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)。
我在这里有两个问题:
大约只进行插值,即它不会在 min(x) 和 max(x) 之间创建线性拟合。如果我现在对 1:100 天感兴趣,我首先需要使用第 9 天和第 15 天(A 的前 2 行)通过以下方式手动完成:
first_days …