给定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("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>)我希望第一列是bit64::as.integer64(),其余的列是as.numeric()
我试着这样做:
dt <- dt[ ,V1 := bit64::as.integer64(V1)]
dt[, lapply(.SD, as.numeric), .SDcols = -c("V1")]但是它似乎没有做我想做的事情,请建议如何将特定列更改为A类(integer64),其余列改为另一类B(例如as.numeric())?
发布于 2018-12-15 16:54:22
谢谢各位,@dirk_eddelbuettel我做到了:
1)加载所有JSON文件(在我的例子中)并使用
bigint_as_char=TRUE在fromJSON命令中。
2)现在您有了一个大表,其中所有的列都是字符。
3)将时间戳列转换为bit64::as.integer64() --得到我想要的数字。
4)将其他类型转换为所需的类型。
5)当我想要执行计算时,例如timestamp - lag(timestamp),我将lag_timestamp = lag(timestamp) (带有dplyr::mutate)添加为新列,并添加diff_column =存储它为as.character()
6)您几乎完成了--新的diff列将我想要的值存储为字符串/字符,现在您可以在需要时将其转换为as.numeric(),或者应用ifelse()来处理非相关的值。
7)仅此而已,它对我来说是完美的,不要让R崩溃。
在应用我的解决方案之前,solution崩溃了。
发布于 2018-12-14 23:27:27
从上面的注释来看,您似乎希望能够在一步内完成所有这些工作,而不是将第一个步骤转换为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函数一起迭代您的输入。也就是说,它接受第一个和第二个向量的第一个元素,并将它们作为参数传递给我们的函数。然后,它将两个向量的第二个元素传递给函数。
在我们的Map电话中,我们有:
fun和(2) x。我们的函数的结果是将fun应用于x或fun(x)。作为一个具体的例子,尝试:
函数(as.numeric,c("1",“1”);类(Res)fun主函数中用作。在本例中,它的list(as.integer64, as.numeric, as.numeric,...)x主函数中用作。在本例中,我们的dt的每一列。快速而肮脏的视觉辅助是如何工作的(假设custom_function有两个参数):

发布于 2018-12-15 00:21:22
在我看来,您有一个data.table对象,它具有自那个时代以来的integer64纳秒时间戳。我在工作中使用同样的方法来表示高分辨率的时间戳。
好消息是,data.table支持这一点--依赖于我们的包纳米时间,它本身使用bit64作为integer64类型。但是,我创建时间戳的方式有所不同,通常与我检索数据的编译代码不同。
我在Rcpp画廊 in 这个职位上详细描述了这一点。所以一些好消息:这是可以做到的。一些坏消息:我不认为你能用你想要的方式去做,因为我们只能通过double,它只有16个小数点的精度,而不是19个。但也许我错过了窍门,所以如果存在更简单的解决方案,我会全神贯注。(我总是忘记是否有一个‘解析int64从字符串方法’。我从来没有走过这条路,因为你不能在规模上做到这一点--我也处理相当大的数据集。)
https://stackoverflow.com/questions/53787626
复制相似问题