从data.frame中删除列表类型的列

从data.frame中删除列表类型的列,r,list,dataframe,subset,R,List,Dataframe,Subset,如果data.frame具有列表列并试图将其写入csv文件,用户如何删除列表类型的所有列 dput将相当长。请参见此处的示例 请注意,完整的df有5+个列表列,我不喜欢枚举它们或按名称查找它们 > str(df,max.level=1) Classes ‘tbl_df’, ‘tbl’ and 'data.frame': 2237 obs. of 30 variables: $ CATEGORY : chr "ARTICLE " "ARTICLE " "ARTICLE " "

如果data.frame具有列表列并试图将其写入csv文件,用户如何删除列表类型的所有列

dput将相当长。请参见此处的示例 请注意,完整的df有5+个列表列,我不喜欢枚举它们或按名称查找它们

> str(df,max.level=1)
Classes ‘tbl_df’, ‘tbl’ and 'data.frame':   2237 obs. of  30 variables:
 $ CATEGORY    : chr  "ARTICLE " "ARTICLE " "ARTICLE " "ARTICLE " ...
 $ BIBTEXKEY   : chr  "RN69" "RN4023" "RN3332" "RN58" ...
 $ ADDRESS     : chr  NA NA NA NA ...
 $ ANNOTE      : chr  NA NA NA NA ...
 $ AUTHOR      :List of 2237
 $ BOOKTITLE   : chr  NA NA NA NA ...
 and 40+ other columns

> names(df)
 [1] "CATEGORY"     "BIBTEXKEY"    "ADDRESS"      "ANNOTE"       "AUTHOR"       "BOOKTITLE"   
 [7] "CHAPTER"      "CROSSREF"     "EDITION"      "EDITOR"       "HOWPUBLISHED" "INSTITUTION" 
[13] "JOURNAL"      "KEY"          "MONTH"        "NOTE"         "NUMBER"       "ORGANIZATION"
[19] "PAGES"        "PUBLISHER"    "SCHOOL"       "SERIES"       "TITLE"        "TYPE"        
[25] "VOLUME"       "YEAR"         "ISSN"         "DOI"          "ISBN"         "URL"         
> 
该命令应该类似于

df%>%选择\u如果!是.list,但不完全正确

df来自

devtools::install_github("ropensci/bib2df")
library(bib2df)
url <- "https://cprd.com/bibliography/export/bibtex"
df <- bib2df(url)

如果需要使用逻辑索引:

  df[,!purrr::map_lgl(df,is.list)] %>% 
   names()
 [1] "CATEGORY"     "BIBTEXKEY"    "ADDRESS"      "ANNOTE"       "BOOKTITLE"   
 [6] "CHAPTER"      "CROSSREF"     "EDITION"      "HOWPUBLISHED" "INSTITUTION" 
[11] "JOURNAL"      "KEY"          "MONTH"        "NOTE"         "NUMBER"      
[16] "ORGANIZATION" "PAGES"        "PUBLISHER"    "SCHOOL"       "SERIES"      
[21] "TITLE"        "TYPE"         "VOLUME"       "YEAR"         "ISSN"        
[26] "DOI"          "ISBN"         "URL"  
您还可以执行df%>%选择\u ifNegateis.list

另外,正如@akrun所提到的, 您只需使用purrr中的discard:

或者正如@markus指出的,我们可以使用keep和negate:

否则:

我们可以:

library(tidyverse)
df %>% 
  unnest(AUTHOR) %>% 
  select(-AUTHOR)
给定

得到

# A tibble: 1 x 1
#      a
#  <dbl>
#1     1

你确定data.frame中的列可以是list类型吗?Hi UserJT,你能用示例dput将其作为最小可复制示例,以便我们可以看到你的数据帧吗?谢谢:@akash87嵌套数据帧可以包含列表。类似mtcars%>%select_if!is.numeric请使用UnnesAuthor,然后将其删除。最好使用dput添加数据。很好,但我需要通过!is.list标准。当然我有df%>%selectTITLE,DOI,TYPE,YEAR%>%write_csv'cprd-pubs.csv'只是好奇,为什么!筛选器中的is.list失败?尝试了,但失败了。我只能引用帮助页:否定创建给定函数的否定。虽然表示逻辑否定不是。希望这有点帮助。*失败。谢谢,奇怪。也许这符合OP的目标:df%>%select_ifNegateis。list@NelsonGon或图书馆的咕噜声;如果你想呆在垃圾桶里,请继续,否定。谢谢。已编辑以添加此选项。很高兴了解否定。
keep(dat, negate(is.list))
library(tidyverse)
df %>% 
  unnest(AUTHOR) %>% 
  select(-AUTHOR)
dat <- tibble::tibble(a = 1,
                      b = list(d = c(1, 2)))
Filter(Negate(is.list), dat)
# A tibble: 1 x 1
#      a
#  <dbl>
#1     1
function (f) 
{
    f <- match.fun(f)
    function(...) !f(...)
}