簡體   English   中英

用於 Power BI 的 R 到 JSON 中的嵌套列表

[英]Nested lists in R to JSON for Power BI

我在 R 中創建了一個數據集,其中包含 20 個變量的 800 個觀測值,其中一些是向量(長度不同),例如 observation1: var1=1, var2="a", vec1=c("a", "b", "c"), vec2 = c(1,2,3) 觀察2: var1=1, var2="a", vec1=c("a"), vec2 = c(1,2,3,4,5)

我試圖創建一個單一的數據框,但它不喜歡不同長度的向量,所以目前數據存在為長度為 800 的多個向量(一個用於 var1,一個用於 var2 等)和多個長度為 800 的列表(包含vec1、vec2 等)

將其組合成單個數據 object 以使用嵌套列表的唯一方法是?

最終我需要將 output 作為 JSON 帶入 Power BI,但我不知道如何結合現有元素來實現這一點。 我嘗試創建一個嵌套列表,然后創建 toJSON(),但這並不能解析為包含列的表(在 Power BI 中),而是每個列表項顯示為需要擴展為 800 行的行。

非常感謝任何幫助!

Since your ultimate goal is to import this dataset into powerBI, going by dataframe would be best, because in powerBI you would have to again convert it into tabular structure, so converting from dataframe to json and then json to dataframe is a bit of overdo.

現在將不同長度的向量轉換為 dataframe,您將收到一個錯誤,因為 dataframe 中的元素需要具有相同的長度。 所以訣竅是通過用 NA(或任何占位符,如“空白”)填充額外的元素,使這些元素的長度相同。

#function to generate vectors of varying length
temp_vectors = function(n){
  vector_list = vector('list', n)
  max_size = 0
  
  for(i in 1:n){
    vec_size = sample(1:20, 1)
    vector_list[[i]] = sample(1:10, vec_size, replace=TRUE)
    if(max_size < vec_size) max_size = vec_size
  }
  
  return(list('max_size' = max_size, 'vector_list' = vector_list))
}

x = temp_vectors(10)
vectors = x[['vector_list']]
n = x[['max_size']]

#the above code produces the following vector
vectors[1:2]
#> [[1]]
#>  [1] 6 8 5 5 9 2 1 2 4 7 3 8
#> 
#> [[2]]
#> [1] 1 4 8 8 7 9

#for loop to fill the extra places with NA
for(i in 1:10){
  if(length(vectors[[i]] != n)){
    length(vectors[[i]]) = n
  }
}

vectors[1:2]
#> [[1]]
#>  [1]  6  8  5  5  9  2  1  2  4  7  3  8 NA NA NA NA NA NA NA NA
#> 
#> [[2]]
#>  [1]  1  4  8  8  7  9 NA NA NA NA NA NA NA NA NA NA NA NA NA NA

#combining the vectors into df
df = data.frame(vectors)
colnames(df) = paste0('col.', 1:ncol(df))
df
#>    col.1 col.2 col.3 col.4 col.5 col.6 col.7 col.8 col.9 col.10
#> 1      6     1     3     7     8     6     5     3     6      9
#> 2      8     4    NA     7    10     8     5     1     8     NA
#> 3      5     8    NA    10     5     9     7    NA     1     NA
#> 4      5     8    NA     4     4     2     8    NA     8     NA
#> 5      9     7    NA    NA     6     6     6    NA     9     NA
#> 6      2     9    NA    NA     5     4     7    NA     4     NA
#> 7      1    NA    NA    NA     1     1     2    NA     8     NA
#> 8      2    NA    NA    NA     9     7     6    NA     5     NA
#> 9      4    NA    NA    NA     4     8    10    NA     8     NA
#> 10     7    NA    NA    NA     3     6    NA    NA     1     NA
#> 11     3    NA    NA    NA     1     6    NA    NA     9     NA
#> 12     8    NA    NA    NA     6     7    NA    NA     8     NA
#> 13    NA    NA    NA    NA     6     8    NA    NA    10     NA
#> 14    NA    NA    NA    NA     2     8    NA    NA    10     NA
#> 15    NA    NA    NA    NA     1     9    NA    NA     5     NA
#> 16    NA    NA    NA    NA     2     3    NA    NA     2     NA
#> 17    NA    NA    NA    NA     1     1    NA    NA    NA     NA
#> 18    NA    NA    NA    NA     6     6    NA    NA    NA     NA
#> 19    NA    NA    NA    NA    NA     9    NA    NA    NA     NA
#> 20    NA    NA    NA    NA    NA     9    NA    NA    NA     NA

代表 package (v0.3.0) 於 2020 年 7 月 4 日創建

請注意,您可以對 800 個向量執行相同操作,遍歷它們並將它們的大小更改為最長向量的大小,額外的索引將自動填充 NA。

據我了解,您目前擁有:

vector_var1 <- c(1, 1)
vector_var2 <- c("a", "a")
list_vec1 <- list(c("a", "b", "c"), c("a"))
list_vec2 <- list(c(1,2,3), c(1,2,3,4,5))

您可以將其放在帶有列表列的 dataframe 中:

dat <- data.frame(
  var1 = vector_var1,
  var2 = vector_var2,
  vec1 = I(list_vec1),
  vec2 = I(list_vec2)
)

這給出了這個 JSON:

jsonlite::toJSON(dat, pretty = TRUE)
# [
#   {
#     "var1": 1,
#     "var2": "a",
#     "vec1": ["a", "b", "c"],
#     "vec2": [1, 2, 3]
#   },
#   {
#     "var1": 1,
#     "var2": "a",
#     "vec1": ["a"],
#     "vec2": [1, 2, 3, 4, 5]
#   }
# ]

這是你需要的嗎?

編輯

在評論中的討論之后,這里是如何使用purrr::transposerlist::list.zip來實現所需的結果:

vector_var1 <- c(1, 1)
vector_var2 <- c("a", "a")
list_vec1 <- list(c("a", "b", "c"), c("a", "b", "c", "d", "e"))
list_vec2 <- list(c(1,2,3), c(1,2,3,4,5))

L1 <- purrr::transpose(list(list_vec1, list_vec2))
L2 <- lapply(L1, function(vecs){
  do.call(rlist::list.zip, c(vecs, list(use.names=FALSE)))
})

dat <- data.frame(var1 = vector_var1, var2 = vector_var1, vec = I(L2))

jsonlite::toJSON(dat, auto_unbox = TRUE)
# [{"var1":1,"var2":1,"vec":[["a",1],["b",2],["c",3]]},{"var1":1,"var2":1,"vec":[["a",1],["b",2],["c",3],["d",4],["e",5]]}]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM