从嵌套列表数据框中删除 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
下面这个好像真的是个棘手的问题:
我有一个带有嵌套列表的数据框:
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