R 从列表中的单个数据帧中删除NA行

R 从列表中的单个数据帧中删除NA行,r,dplyr,R,Dplyr,从列表中的单个数据帧中删除NA行 我想在管道内完成这项工作 #Sample data: l <- list(a=c("X", "Y", "Z"), b = data.frame(a=c("A", "B", "C", NA), b=c("R", "G", "B", NA)), c = data.

从列表中的单个数据帧中删除NA行

我想在管道内完成这项工作

#Sample data:
l <- list(a=c("X", "Y", "Z"),
     b = data.frame(a=c("A", "B", "C", NA), b=c("R", "G", "B", NA)),
     c = data.frame(header=c(1,2,3), value=c(0, 10, 15)))

如果您特别想对名为“b”的列表成员采取行动,您可以使用
map\u If

l %>% 
  map_if(names(.) == "b", na.omit)
lappy(l,na.omit)
将从列表的任何元素中删除na行

lapply(l, na.omit)

$a
[1] "X" "Y" "Z"

$b
  a b
1 A R
2 B G
3 C B

$c
  header value
1      1     0
2      2    10
3      3    15
如果确实要对任何元素使用
map
和管道:

l %>% 
  map(., na.omit)
Filter()没有list方法(因此错误:“error in UseMethod(“Filter_”):没有适用于“Filter_”的方法应用于类“list”的对象)

你可以把lappy放在这样的管子上

l%>%lappy(不适用)

一个非管道的方式是


l$b如果列表中的元素是数据帧,则可以删除
NA

lapply(l, function(x) if(inherits(x, 'data.frame')) na.omit(x) else x)
地图相同

purrr::map(l, ~if(inherits(.x, 'data.frame')) na.omit(.x) else .x)

啊,如果这是我想要的。谢谢如果我还想过滤掉c中header==2的行呢。这不起作用:map_if(name(.)=“c”,filter(header!=“2”))更复杂一点:
l%>%map_if(name(.)=“c”,“filter(.x,header!=2))
谢谢@neilfws。你是个巫师
purrr::map(l, ~if(inherits(.x, 'data.frame')) na.omit(.x) else .x)