从嵌套列表数据框中删除 NA

Remove NAs from nested list data frame

下面这个好像真的是个棘手的问题:

我有一个带有嵌套列表的数据框:

df <- structure(list(zerobonds = c(1, 1, NA), nominal = c(20, 20, NA
), calls = list(list(c(NA, -1), 1), list(list(NA, -1), 1), NA), 
call_strike = list(list(c(NA, 90), 110), list(list(NA, 90), 
                                              110), NA), puts = list(NA, NA, list(c(NA, 1), -1)), put_strike = list(
                                                NA, NA, list(c(NA, 110), 90))), row.names = c(NA, -3L
                                                ), class = "data.frame")
df
##   zerobonds nominal     calls call_strike      puts  put_strike
## 1         1      20 NA, -1, 1 NA, 90, 110        NA          NA
## 2         1      20 NA, -1, 1 NA, 90, 110        NA          NA
## 3        NA      NA        NA          NA NA, 1, -1 NA, 110, 90

我想打印没有任何结构的结构 NAs(点而不是空白也可以):

  zerobonds nominal calls call_strike  puts put_strike
1         1      20 -1, 1     90, 110                 
2         1      20 -1, 1     90, 110                 
3                                     1, -1    110, 90

我已经尝试了各种方法,到目前为止最好的方法似乎是 rapply(df, na.omit, how = "replace") 我什至无法抑制警告(suppressWarnings 在这里似乎不起作用!)。 print(df, na.print = "") 也无济于事。

我现在真的很累,似乎什么都行不通...毕竟嵌套列表形式的数据框似乎不是一个好主意...有人可以帮忙吗?

您可以创建自己的递归函数并将其应用于每一列:

rm_nested_na <- function(x) {
  if (is.atomic(x)) {
    na.omit(x)
  } else {
    lapply(x, rm_nested_na)
  }
}

res <- df
listcol <- sapply(res, is.list)
res[listcol] <- lapply(res[listcol], rm_nested_na)

res

如果嵌套很深,这显然效率低下。

您可以试试下面的代码

df[]<-rapply(Map(as.list,df), na.omit, how = "replace")

这给出了

> df
  zerobonds nominal calls call_strike  puts put_strike
1         1      20 -1, 1     90, 110
2         1      20 -1, 1     90, 110
3                                     1, -1    110, 90