我有大约15个包含10万至30万行的
data.frame
。我想通过变量v
将其他列压缩成字符json格式以节省存储空间。请注意,v
中的每个组都将有多行(1行或更多;可能更多)。我下面的代码使用了jsonlite
包来转换,但由于我设置的拆分方式,它很慢且不够高效。如何更快、更高效地完成此任务?我不需要使用jsonlite
包,只是因为这是我唯一知道的方法。我认为可以用data.table
直接快速生成字符json,但无法想到具体实现方法。
附言:如果了解我的动机会有所帮助……我这样做是为了拥有一个哈希表,我可以在其中查找v
,然后将json转换回R data.frame
。也许有一种比我现在用的更直接的方法可以使用jsonlite
,但toJSON(dat)
并不是我想要的。
最小工作示例(MWE)
set.seed(10)
dat <- data.frame(
v = rep(c('red', 'blue'), each =3),
w = sample(LETTERS, 6),
x = sample(1:3, 6, T),
y = sample(1:3, 6, T),
z = sample(1:3, 6, T),
stringsAsFactors = FALSE
)
dat
数据视图
v w x y z
1 red N 1 1 2
2 red H 1 2 3
3 red K 2 2 3
4 blue P 2 2 2
5 blue B 2 1 3
6 blue E 2 1 2
转换
library(jsonlite)
jsonlist <- lapply(split(dat[-1], dat$v), function(x) as.character(toJSON(x)))
data.frame(
v = names(jsonlist),
json = unlist(jsonlist, use.names=FALSE),
stringsAsFactors = FALSE
)
期望结果
v json
1 blue [{"w":"P","x":2,"y":2,"z":2},{"w":"B","x":2,"y":1,"z":3},{"w":"E","x":2,"y":1,"z":2}]
2 red [{"w":"N","x":1,"y":1,"z":2},{"w":"H","x":1,"y":2,"z":3},{"w":"K","x":2,"y":2,"z":3}]
.
并不是你想象中的那样。它似乎只是在do()
中引用子集。 - Arunv
中的信息,而不是先扩展数据,只有在查找v
之后再扩展它。这将大大减少初始搜索的行数(从1000万减少到100万)。 - Tyler Rinker