如何在R中以多列表为列创建CSV?遇长度报错求排查
问题原因与解决方案
你的核心问题是用lapply生成的列表直接传入data.frame()时,R会将整个列表当作单列的单个元素,导致数据挤成一行;如果某个列表元素意外包含多值,就会触发长度不一致的报错——哪怕你看到的列表长度相同,每个元素的内部长度可能存在差异。
解决思路
把每个lapply生成的列表转换成向量(每个元素是单个值的一维结构),这样data.frame()就能正确识别为列。有两种简单实现方式:
- 用
sapply()替代lapply():sapply会自动将结果简化为向量(当每个元素长度一致时)。 - 对
lapply的结果用unlist()转换为向量。
修改后的完整代码
library(jsonlite) library(data.table) json_data_file <- file.choose() json_data <- fromJSON(file=json_data_file) buckets <- json_data$aggregations$my_date_histo$buckets # 用sapply生成向量,替代lapply filesystem_used_pct_value <- sapply(buckets, function(x) ifelse(is.null(x$filesystem_used_pct$value), NA, x$filesystem_used_pct$value)) system_core_user_pct_value <- sapply(buckets, function(x) ifelse(is.null(x$system_core_user_pct$value), NA, x$system_core_user_pct$value)) system_core_system_pct_value <- sapply(buckets, function(x) ifelse(is.null(x$system_core_system_pct$value), NA, x$system_core_system_pct$value)) system_memory_actual_used_pct_value <- sapply(buckets, function(x) ifelse(is.null(x$system_memory_actual_used_pct$value), NA, x$system_memory_actual_used_pct$value)) system_memory_swap_used_pct_value <- sapply(buckets, function(x) ifelse(is.null(x$system_memory_swap_used_pct$value), NA, x$system_memory_swap_used_pct$value)) system_cpu_total_pct_value <- sapply(buckets, function(x) ifelse(is.null(x$system_cpu_total_pct$value), NA, x$system_cpu_total_pct$value)) system_cpu_system_pct_value <- sapply(buckets, function(x) ifelse(is.null(x$system_cpu_system_pct$value), NA, x$system_cpu_system_pct$value)) key <- sapply(buckets, function(x) x$key_as_string) # 验证向量长度(可选) length(filesystem_used_pct_value) length(key) # 生成数据框并导出 df <- data.frame( timestamp = key, filesystem_used_pct = filesystem_used_pct_value, system_core_user_pct = system_core_user_pct_value, system_core_system_pct = system_core_system_pct_value, system_memory_actual_used_pct = system_memory_actual_used_pct_value, system_memory_swap_used_pct = system_memory_swap_used_pct_value, system_cpu_total_pct = system_cpu_total_pct_value, system_cpu_system_pct = system_cpu_system_pct_value ) write.csv(df, "elastic_aggs_metric.csv", row.names = FALSE)
额外优化(可选)
如果想避免重复写sapply,可以用purrr包的map_dbl更简洁地批量提取数值:
library(purrr) # 定义通用提取函数 extract_metric <- function(bucket, metric_name) { map_dbl(bucket, ~ ifelse(is.null(.x[[metric_name]]$value), NA, .x[[metric_name]]$value)) } # 批量提取所有指标 metrics <- c( "filesystem_used_pct", "system_core_user_pct", "system_core_system_pct", "system_memory_actual_used_pct", "system_memory_swap_used_pct", "system_cpu_total_pct", "system_cpu_system_pct" ) metric_values <- map_dfc(metrics, ~ extract_metric(buckets, .x)) names(metric_values) <- metrics # 加入时间戳并导出 df <- cbind(data.frame(timestamp = sapply(buckets, `[[`, "key_as_string")), metric_values) write.csv(df, "elastic_aggs_metric.csv", row.names = FALSE)
内容的提问来源于stack exchange,提问作者neuralsea
相关产品推荐
相关产品推荐

