我遇到了在强制进入数据框之前要解析的列表.有时我的列表中包含我不期望的元素.我希望能够在出现时按名称删除所有这些意外元素.下面是一个列表示例,其中包含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)
我认为你在预期的使用中有太多的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返回数值并使用数值索引列表.但是,不能使用带有字符和逻辑值的负号.
bind_rowsdplyr即使并非所有列表共享相同的元素名称,也可以从包中工作.然后,您可以删除不需要的列.
library(dplyr)
df = bind_rows(my_list)
Run Code Online (Sandbox Code Playgroud)
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
df = df[ , -grep("wackything", names(df))]
Run Code Online (Sandbox Code Playgroud)
Run Code Online (Sandbox Code Playgroud)name phone 1 mike 111-1111 2 lisa 222-2222 3 kimo 333-3333