如果元素存在于列表的所有子元素中,则删除该元素

cyl*_*ude 6 r

我遇到了在强制进入数据框之前要解析的列表.有时我的列表中包含我不期望的元素.我希望能够在出现时按名称删除所有这些意外元素.下面是一个列表示例,其中包含wackything我想要删除的元素,而无需调用元素索引或使用for循环遍历每个子元素.

my_list <- list(person = list(name = "mike", phone = "111-1111"), 
 person = list(name = "lisa", phone = "222-2222", wackything = "PLEASE REMOVE ME"),
 person = list(name = "kimo", phone = "333-3333"))
Run Code Online (Sandbox Code Playgroud)

我希望我的最终列表看起来像这样:

final_list <- list(person = list(name = "mike", phone = "111-1111"), 
            person = list(name = "lisa", phone = "222-2222"),
            person = list(name = "kimo", phone = "333-3333"))
Run Code Online (Sandbox Code Playgroud)

这样我就可以使用它将其核心化为数据帧

do.call(rbind, lapply(final_list, rbind))
Run Code Online (Sandbox Code Playgroud)

42-*_*42- 6

我认为你在预期的使用中有太多的rbinds.看看这是否令人满意:

> rmwac <- function(x) x[ !names(x) %in% "wackything"]
> do.call(rbind, lapply(my_list, rmwac))
       name   phone     
person "mike" "111-1111"
person "lisa" "222-2222"
person "kimo" "333-3333"
Run Code Online (Sandbox Code Playgroud)

请注意,epi10的完美答案使用负号,这是可能的,因为可以grep返回数值并使用数值索引列表.但是,不能使用带有字符和逻辑值的负号.


eip*_*i10 5

bind_rowsdplyr即使并非所有列表共享相同的元素名称,也可以从包中工作.然后,您可以删除不需要的列.

library(dplyr)

df = bind_rows(my_list)
Run Code Online (Sandbox Code Playgroud)
   name    phone       wackything
1  mike 111-1111               NA
2  lisa 222-2222 PLEASE REMOVE ME
3  kimo 333-3333               NA
Run Code Online (Sandbox Code Playgroud)
df = df[ , -grep("wackything", names(df))]
Run Code Online (Sandbox Code Playgroud)
   name    phone
1  mike 111-1111
2  lisa 222-2222
3  kimo 333-3333
Run Code Online (Sandbox Code Playgroud)