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

时间:2020-07-24 09:00:58

标签: r list dataframe na nested-lists

以下内容似乎很难破解:

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

void main() {
  Future(() => print('future 1'));
  Future(() => print('future 2'));
  // Microtasks will be executed before futures.
  Future.microtask(() => print('microtask 1'));
  Future.microtask(() => print('microtask 2'));
}

我要打印没有任何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也无济于事。

我现在真的很精疲力竭,似乎什么也没用……以嵌套列表形式出现的数据框似乎并不是一个好主意……有人可以帮忙吗?

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:1)

您可以尝试下面的代码

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