将数据框中的列表单元格转换为行

时间:2016-02-21 09:49:32

标签: json r

我很抱歉没有代码可以复制,我只能提供一张图片。请看下面。

从JSON准备的带有Facebook见解数据的数据框包含一列"值"列表值。对于下一次操作,我需要在列中只有一个值。因此,图片上的第3行应该转换为两个(直接列表内容或值):

post_story_adds_by_action_type_unique   lifetime   list(like = 38)
post_story_adds_by_action_type_unique   lifetime   list(share = 11)

如果数据框列表单元格中有3个或更多值,则应该生成3个或更多单值行。

你知道怎么做吗?

我使用此代码获取json和数据框:

i <- fromJSON(post.request.url)
i <- as.data.frame(i$insights$data)

enter image description here

编辑:

  • 没有更深的嵌套,只有这一层。
  • 结果中不需要列表,我只需要值及其名称。

1 个答案:

答案 0 :(得分:1)

让我们假设你从一个看起来像这样的东西开始:

threading
mydf <- data.frame(a = c("A", "B", "C", "D"), period = "lifetime")
mydf$values <- list(list(value = 42), list(value = 5), 
                    list(value = list(like = 38, share = 11)),
                    list(value = list(like = 38, share = 13)))

我建议不要在输出中保留列表,而是使用这样的函数来展平数据:

 str(mydf)
## 'data.frame':    4 obs. of  3 variables:
##  $ a     : Factor w/ 4 levels "A","B","C","D": 1 2 3 4
##  $ period: Factor w/ 1 level "lifetime": 1 1 1 1
##  $ values:List of 4
##   ..$ :List of 1
##   .. ..$ value: num 42
##   ..$ :List of 1
##   .. ..$ value: num 5
##   ..$ :List of 1
##   .. ..$ value:List of 2
##   .. .. ..$ like : num 38
##   .. .. ..$ share: num 11
##   ..$ :List of 1
##   .. ..$ value:List of 2
##   .. .. ..$ like : num 38
##   .. .. ..$ share: num 13
## NULL

以下是我分享的“mydf”的作用:

myFun <- function(indt, col) {
  if (!is.data.table(indt)) indt <- as.data.table(indt)
  other_names <- setdiff(names(indt), col)
  list_col <- indt[[col]]
  rep_out <- sapply(list_col, function(x) length(unlist(x, use.names = FALSE)))
  flat <- {
    if (is.null(names(list_col))) names(list_col) <- seq_along(list_col)
    setDT(tstrsplit(names(unlist(list_col)), ".", fixed = TRUE))[
      , val := unlist(list_col, use.names = FALSE)][]
  }
  cbind(indt[rep(1:nrow(indt), rep_out)][, (col) := NULL], flat)
}