将data.table列类分别更改为integer64和double

将data.table列类分别更改为integer64和double,r,data.table,R,Data.table,给定数据表dt: dt <- structure(list(V1 = c("1544018118438041139", "1544018118466235879", "1544018118586849680", "1544018118601169211", "1544018118612947335", "1544018118614422179"), V2 = c("162", "162", "161.05167", "158.01309", "157", "157"), V3 = c

给定数据表dt:

dt <- structure(list(V1 = c("1544018118438041139", "1544018118466235879", 
"1544018118586849680", "1544018118601169211", "1544018118612947335", 
"1544018118614422179"), V2 = c("162", "162", "161.05167", "158.01309", 
"157", "157"), V3 = c("38", "38", "36.051697", "33.01306", "32", 
"32"), V4 = c("0.023529414", "0.025490198", "0.023529414", "0.027450982", 
"0.03137255", "0.03137255"), V5 = c("1", "1", "1", "1", "1", 
"1"), V6 = c("2131230815", "2131230815", "2131230815", "2131230815", 
"2131230815", "2131230815"), V7 = c("1", "0", "0", "0", "0", 
"-1")), class = c("data.table", "data.frame"), row.names = c(NA, 
-6L), .internal.selfref = <pointer: 0x2715f60>)

但它似乎并不能满足我的要求,请建议如何将特定列更改为类Ainteger64,将其余列更改为另一个类B,例如.numeric?

从上面的评论来看,您似乎希望能够一步完成这一切,而不是将第一个列转换为整数64,然后将其余列转换为双精度。一种方法是:

dt[, names(dt) := Map(function(fun, x) fun(x), rep(list(bit64::as.integer64, as.numeric), times = c(1,length(.SD) - 1)), .SD), .SDcols = names(dt)]
Map函数一起迭代输入。也就是说,它获取第一个和第二个向量的第一个元素,并将它们作为参数传递给我们的函数。然后它获取两个向量的第二个元素并将它们传递给函数

在我们的地图呼叫中,我们有:

要应用的主要函数。这是一个匿名函数,它包含两个片段:1个fun和2个x。我们函数的结果是将fun应用于x或funx的结果。有关具体示例,请尝试:

myfun <- function(fun, x){
  fun(x)
}
res<-myfun(as.numeric, c("1","1")); class(res)
传递给主函数的函数列表。这些将在我们的主要功能中用作乐趣。在本例中,其listas.integer64、as.numeric、as.numeric、

要传递给主函数的向量列表。这些将在我们的主要函数中用作x。在这种情况下,我们的dt的每一列

关于如何工作的一个快速而直观的帮助是假设自定义函数包含两个参数:


从上面的评论来看,您似乎希望能够在一个步骤中完成这一切,而不是将第一个转换为integer64,然后将其余的转换为double。一种方法是:

dt[, names(dt) := Map(function(fun, x) fun(x), rep(list(bit64::as.integer64, as.numeric), times = c(1,length(.SD) - 1)), .SD), .SDcols = names(dt)]
Map函数一起迭代输入。也就是说,它获取第一个和第二个向量的第一个元素,并将它们作为参数传递给我们的函数。然后它获取两个向量的第二个元素并将它们传递给函数

在我们的地图呼叫中,我们有:

要应用的主要函数。这是一个匿名函数,它包含两个片段:1个fun和2个x。我们函数的结果是将fun应用于x或funx的结果。有关具体示例,请尝试:

myfun <- function(fun, x){
  fun(x)
}
res<-myfun(as.numeric, c("1","1")); class(res)
传递给主函数的函数列表。这些将在我们的主要功能中用作乐趣。在本例中,其listas.integer64、as.numeric、as.numeric、

要传递给主函数的向量列表。这些将在我们的主要函数中用作x。在这种情况下,我们的dt的每一列

关于如何工作的一个快速而直观的帮助是假设自定义函数包含两个参数:


在我看来,您有一个data.table对象,自历元以来具有整数64纳秒的时间戳。我在工作中使用相同的方法来表示高分辨率时间戳

好消息是data.table支持这一点,因为它依赖于自身用于integer64类型的包。但是,我创建时间戳的方式不同,通常是从检索数据的编译代码创建时间戳


我在会议上详细描述了这一点。所以有一些好消息:这是可以做到的。一些坏消息:我不认为你可以按照你想要的方式来做,因为我们只能通过双精度运算,它的精度只有16位小数,而不是19位小数。但也许我错过了诀窍,所以若存在更简单的解决方案,我会全神贯注。我总是忘记是否有“从字符串解析int64方法”。我从来没有这样做过,因为你不能在规模上这样做——我也处理相当大的数据集。

在我看来,你有一个data.table对象,自纪元以来时间戳为整数64纳秒。我在工作中使用相同的方法来表示高分辨率时间戳

好消息是data.table支持这一点,因为它依赖于自身用于integer64类型的包。但是,我创建时间戳的方式不同,通常是从检索数据的编译代码创建时间戳


我在会议上详细描述了这一点。所以有一些好消息:这是可以做到的。一些坏消息:我不认为你可以按照你想要的方式来做,因为我们只能通过双精度运算,它的精度只有16位小数,而不是19位小数。但也许我错过了诀窍,所以若存在更简单的解决方案,我会全神贯注。我总是忘记是否有“从字符串解析int64方法”。我从来没有这样做过,因为你不能大规模地这样做——我也处理相当大的数据集。

谢谢大家,@dirk_eddelbuettel我做到了:

dt <- dt[ ,V1 := bit64::as.integer64(V1)]

dt[, lapply(.SD, as.numeric), .SDcols = -c("V1")]
1加载我案例中的所有JSON文件并使用

bigint_as_char=TRUE
在fromJSON命令中

2现在您有了一个大表,其中所有列都是字符

3将时间戳列转换为位64::as.integer64-您可以得到我想要的数字

4将其余的转换为所需的类型

5当我想要执行计算时,例如timestamp-lagtimestamp,我添加了lag_timestamp=lagtimestamp,其中dplyr::mutate as new column和add diff_column=将其存储为.character

6您差不多完成了-新的diff列将我想要的值存储为字符串/字符,现在您可以根据需要将其转换为as.numeric,或者应用ifelse来处理不相关的值

那是艾尔 l、 它非常适合我,而且不要破坏R工作室


在应用我的解决方案之前,R Studio崩溃。

谢谢大家,@dirk_eddelbuettel我成功做到了:

dt <- dt[ ,V1 := bit64::as.integer64(V1)]

dt[, lapply(.SD, as.numeric), .SDcols = -c("V1")]
1加载我案例中的所有JSON文件并使用

bigint_as_char=TRUE
在fromJSON命令中

2现在您有了一个大表,其中所有列都是字符

3将时间戳列转换为位64::as.integer64-您可以得到我想要的数字

4将其余的转换为所需的类型

5当我想要执行计算时,例如timestamp-lagtimestamp,我添加了lag_timestamp=lagtimestamp,其中dplyr::mutate as new column和add diff_column=将其存储为.character

6您差不多完成了-新的diff列将我想要的值存储为字符串/字符,现在您可以根据需要将其转换为as.numeric,或者应用ifelse来处理不相关的值

仅此而已,它对我来说非常适合,而且不要破坏R工作室



在应用我的解决方案之前,R Studio崩溃。

但我希望它是第一列和其他列,我不能保证总是得到这些列的名称,我希望它是通用的@markusAgain@markus first column not V1.SDcols=setdiffnamesdt,namesdt[1]您需要在b:=运算符下执行dt,但我希望它是第一列和其他列,我不能保证总是得到这些列的名称,我希望它是通用的@markusAgain@markus first column not V1.SDcols=setdiffnamedt,namedt[1]您需要在b:=operator@steves如果不清楚,请告诉我。我想我可能会添加一个关于Mapit超级清晰的图形!!!!你肯定解决了我遇到的这类问题,但对我来说最大的问题仍然是处理这些大的19位时间戳数字。我尝试了几乎所有的方法,但没有任何方法可以帮助我在不降低精度的情况下处理这些大数字。也许我可以告诉你我的问题,也许你已经看到了同样的问题。@steves很抱歉,没有看到细节很难说。作为一个新问题,这可能更好。此外,我没有存储大量数据的经验。也许考虑考虑日志或一些转换?这些是纳秒时间戳。所有的转换,包括双重转换,都是松散的信息。@DirkEddelbuettel请看一下我的答案,我设法解决了。@steves如果答案不清楚,请告诉我。我想我可能会添加一个关于Mapit超级清晰的图形!!!!你肯定解决了我遇到的这类问题,但对我来说最大的问题仍然是处理这些大的19位时间戳数字。我尝试了几乎所有的方法,但没有任何方法可以帮助我在不降低精度的情况下处理这些大数字。也许我可以告诉你我的问题,也许你已经看到了同样的问题。@steves很抱歉,没有看到细节很难说。作为一个新问题,这可能更好。此外,我没有存储大量数据的经验。也许考虑考虑日志或一些转换?这些是纳秒时间戳。所有的转换,包括双重转换,都是松散的信息。@DirkEddelbuettel请看一下我的答案,我设法处理了。我设法做到了,请看我的答案@德库·埃德尔布埃特利做到了这一点,请看我的答案@德克·埃德尔布埃泰尔JSON?抖动文本转换很慢,本质上你的答案和我的一样,你必须求助于帮助包。只是一个小小的宣传,我是一个数据科学家,使用AWS S3中的文件进行第一次研究。之后,我不需要处理它,因为ETL专业人员为我提供了包含我所需的所有列的关系数据库。我只是连接到它并跳过数据准备阶段。JSON?抖动文本转换很慢,本质上你的答案和我的一样,你必须求助于帮助包。只是一个小小的宣传,我是一个数据科学家,使用AWS S3中的文件进行第一次研究。之后,我不需要处理它,因为ETL专业人员为我提供了包含我所需的所有列的关系数据库。我只是连接到它,跳过了数据准备阶段。