【发布时间】:2020-09-18 15:47:03
【问题描述】:
我使用 crateDB 将表作为数据帧加载到 R 中。问题是,crateDB 将数组作为逗号分隔的字符串发送。因此,我想将所有数组转换为正确的 R 类型。我还想将数据框转换为列表,因为它可以使用 crateDB 中的对象,这不适用于数据框。 目前这种转换太慢了,所以我尝试了几种方法来提高性能。
如果我有以下数据框:
df <- data.frame(
id = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10),
position = c(
"{\"82.81864\",\"82.586235\",\"82.35383\"}",
"{\"83.81864\",\"83.586235\",\"83.35383\"}",
"{\"84.81864\",\"84.586235\",\"84.35383\"}",
"{\"85.81864\",\"85.586235\",\"85.35383\"}",
"{\"86.81864\",\"86.586235\",\"86.35383\"}",
"{\"87.81864\",\"87.586235\",\"87.35383\"}",
"{\"88.81864\",\"88.586235\",\"88.35383\"}",
"{\"89.81864\",\"89.586235\",\"89.35383\"}",
"{\"90.81864\",\"90.586235\",\"90.35383\"}",
"{\"91.81864\",\"91.586235\",\"91.35383\"}"
),
vcontrol = c(
"{\"t\",\"t\",\"t\",\"t\"}","{\"f\",\"f\",\"f\",\"t\"}",
"{\"f\",\"t\",\"f\",\"t\"}", "{\"t\",\"t\",\"f\",\"t\"}",
"{\"t\",\"t\",\"f\",\"t\"}", "{\"t\",\"f\",\"f\",\"t\"}",
"{\"t\",\"f\",\"f\",\"t\"}", "{\"t\",\"t\",\"f\",\"t\"}",
"{\"t\",\"t\",\"f\",\"t\"}", "{\"t\",\"t\",\"f\",\"f\"}"
)
)
我从两个 for 循环开始,这对于大数据集来说真的很慢。然后我尝试了应用功能:
convertDF = function(dataFrame, dataTypes){
dimension <- dim(x = dataFrame)
names <- names(x = dataFrame)
asList <- lapply(dataFrame, as.list)
for(row in seq_len(length(asList))){
asList[[row]] <- lapply(asList[[x]], convertToRType, type = dataTypes[row])
}
data <- list()
for(datarow in seq_len(dimension[1])){
tempData <- list()
for(datacol in seq_len(dimension[2])){
tempData[[names[datacol]]] <- asList[[datacol]][[datarow]]
}
data[[datarow]] <- tempData
}
return(data)
}
convertToRType 函数使用数据库中使用的类型作为参数,因此它可以告诉是将其转换为整数、双精度还是逻辑。我使用 if 相同的检查来执行此操作。对于数组,我首先删除所有不需要的字符,在 处拆分,然后在整个向量上使用 as.double。
data <- str_replace_all(
string = rawData,
pattern = c("\\{" = "", "\\}" = "", "\"" = "")
)
data <- str_split(string = data, pattern = ",")[[1]]
我这样做是因为我想使用 lapply 的多线程功能,但结果它在 Windows 上更慢。但是有了这个功能,转换只需要以前的一半时间。不过,我仍然不喜欢这个解决方案。代码不干净,性能似乎也不好。
谁能告诉我如何尽可能高效地进行这种转换?我的想法不多了。
【问题讨论】:
-
预期的最终结果是什么?看起来你正在增加
data对象,这是一个很大的禁忌。 -
@RomanLuštrik 最终结果如图所示。它是一个二维列表。
标签: r performance dataframe lapply