以下内容似乎很难破解:
我有一个带有嵌套列表的数据框:
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
也无济于事。
我现在真的很精疲力竭,似乎什么也没用……以嵌套列表形式出现的数据框似乎并不是一个好主意……有人可以帮忙吗?
答案 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