我有一个列表,我正在变成一个数据帧。该列表从API返回,它包含一些NULL
值。关于此主题here和here的SO存在问题,但它们要么处理数据帧,要么在第二个链接的情况下,鼓励OP首先转换为数据帧。我想保留列表结构。
我以下面的方式解析它,这里有一些示例数据:
example <- list(
list(
ID = "1",
Name = "Joe",
Middle_name = "Alan",
Surname = "Smith"
),
list(
ID = "2",
Name = "Sarah",
Middle_name = NULL,
Surname = "Jones"
),
list(
ID = "3",
Name = "Robert",
Middle_name = "Myles",
Surname = "McDonnell"
)
)
N <- NA_character_
df <- tibble::tibble(
id = purrr::map_chr(example, .null = N, "ID"),
name = purrr::map_chr(example, .null = N, "Name"),
middle = purrr::map_chr(example, .null = N, "Middle_name"),
surname = purrr::map_chr(example, .null = N, "Surname")
)
> df
# A tibble: 3 x 4
id name middle surname
<chr> <chr> <chr> <chr>
1 1 Joe <NA> Smith
2 2 Sarah <NA> Jones
3 3 Robert <NA> McDonnell
看来这个问题在purrr repo中有一些历史记录,但是当我使用像is_empty()
或compact()
这样的purrr函数时,我得到错误或者它没有工作。
有没有人知道如何实现这一目标,最好是保持tibble
&amp; map_chr
方法我在上面使用?
答案 0 :(得分:12)
df = setNames(object = data.frame(do.call(rbind, lapply(example, as.character, unlist))),
nm = names(example[[1]]))
df
# ID Name Middle_name Surname
#1 1 Joe Alan Smith
#2 2 Sarah NULL Jones
#3 3 Robert Myles McDonnell
replace(df, df=="NULL", NA)
# ID Name Middle_name Surname
#1 1 Joe Alan Smith
#2 2 Sarah <NA> Jones
#3 3 Robert Myles McDonnell
答案 1 :(得分:4)
您的示例适用于 purrr 的开发版本。
NULL
行导致方法出现问题,例如使用dplyr::bind_rows
,否则会将列表列表折叠为tibble。解决NULL
行的解决方法是遍历每个列表并flatten
。循环通过map_df
绑定行并提供您想要的结果。
map_df(example, flatten)
# A tibble: 3 x 4
ID Name Middle_name Surname
<chr> <chr> <chr> <chr>
1 1 Joe Alan Smith
2 2 Sarah <NA> Jones
3 3 Robert Myles McDonnell