我很抱歉没有代码可以复制,我只能提供一张图片。请看下面。
从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)
编辑:
答案 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)
}