【发布时间】:2022-01-18 23:41:42
【问题描述】:
我想将 JSON 列添加到现有的 data.frame 中,其中包含大多数每一行的信息。下面的代码显示了我当前的方法并达到了我想要的结果。
# Establish test data
testData <- data.table::data.table(id = 1:10000,
var1 = rep(letters[1:10], times = 1000),
var2 = rep(letters[11:20], times = 1000))
# Establish which variables will be JSON-ed
jsonVars <- c("var1","var2")
# Initialize JSON column
testData[["json"]] <- as.character(NA)
# Loop through and populate JSON column
for(i in 1:nrow(testData)) {
cat(paste0("Running ", i, " of ", nrow(testData), "\n"))
testData[i,][["json"]] <- gsub('^.|.$','',jsonlite::toJSON(testData[i,jsonVars,with=F]))
}
# Keep only the identifier and JSON fields
testData <- testData[,c("id","json"),with=F]
如您所见,我想要的结果只是一个“id”字段和“json”字段,其中包含所有行的信息。
虽然上述方法有效,但速度太慢,因为我的“真实”数据集有数百万条记录和约 300 列。
我尝试使用apply()(见下文),但性能没有提高
# Establish test data
testData <- data.table::data.table(id = 1:10000,
var1 = rep(letters[1:10], times = 1000),
var2 = rep(letters[11:20], times = 1000))
# Establish which variables will be JSON-ed
jsonVars <- c("var1","var2")
# Initialize JSON column
testData[["json"]] <- as.character(NA)
# Use apply to populate JSON column
jsonFUN <- function(x) { gsub('^.|.$','',jsonlite::toJSON(testData[,jsonVars,with=F])) }
testData$json <- apply(X = testData, MARGIN = 1, FUN = jsonFUN)
# Keep only the identifier and JSON fields
testData <- testData[,c("id","json"),with=F]
有人知道更快完成这项任务的有效方法吗?
也许答案是更好地使用data.table 工具。 jsonlite::toJSON 的文档还提到了对向量、data.frames 和数组的处理,但我一直没能找到解决方案。
感谢您的帮助!
【问题讨论】: