将列表中的 NULL 更改为 NA 而不进行转换
Change NULL to NA in list without transformation
我有一个列表,我正在将其转换为数据框。该列表来自 API,它包含一些 NULL
值。在这个主题上有关于 SO 的问题 and here,但它们要么处理数据帧,要么在第二个 link 的情况下,鼓励 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
& map_chr
方法?
您的示例确实适用于 purrr 的开发版本。
NULL
行导致方法出现问题,例如使用 dplyr::bind_rows
,否则这些方法会将列表的列表折叠成小标题。删除 NULL
行的 work-around 是遍历并 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
我有一个列表,我正在将其转换为数据框。该列表来自 API,它包含一些 NULL
值。在这个主题上有关于 SO 的问题
我正在按以下方式解析它,这里是一些示例数据:
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
& map_chr
方法?
您的示例确实适用于 purrr 的开发版本。
NULL
行导致方法出现问题,例如使用 dplyr::bind_rows
,否则这些方法会将列表的列表折叠成小标题。删除 NULL
行的 work-around 是遍历并 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