在没有转换的情况下将NULL更改为NA

时间:2017-06-23 20:40:38

标签: r null purrr

我有一个列表,我正在变成一个数据帧。该列表从API返回,它包含一些NULL值。关于此主题herehere的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方法我在上面使用?

2 个答案:

答案 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