R data.table fread select 与部分字符串匹配?

mys*_*ous 4 select r fread data.table

我想用来fread仅拉入名称与条件匹配的列。(在本例中,我想提取包含标签 的所有列。)想象一下,您在工作目录中email调用的文件中有此数据:tempdata.txt

col1,col2,col3,email1,email2,col4,url1,url2,col5
1,2,3,4,5,6,7,8,9
9,8,7,6,5,4,3,2,1
x,x,x,me@me.com,you@you.com,y,y,y,y
a,a,a,a,a,a,http://google.com,http://stackoverflow.com,a
Run Code Online (Sandbox Code Playgroud)

如果您知道名称,则可以用于fread加载列的子集:

test <- data.table::fread("tempdata.txt", select=c("email1","email2"))

> test
      email1      email2
1:         4           5
2:         6           5
3: me@me.com you@you.com
4:         a           a
Run Code Online (Sandbox Code Playgroud)

是否也可以使用字符串匹配进行选择?我试图模仿这种行为,但在fread命令内:

> all <- data.table::fread("tempdata.txt")
> all %>% select(contains("email"))
      email1      email2
1:         4           5
2:         6           5
3: me@me.com you@you.com
4:         a           a
Run Code Online (Sandbox Code Playgroud)

感谢您的任何见解。

r2e*_*ans 5

我不知道它fread 没有这种能力(尽管我在文档中没有看到它)。然而,一种相对便宜的方法是读取第一行或第二行,获取列名称,grep然后从那里继续。

library(data.table)
fwrite(data.table(a=1:2, email1=c('a','b'), snailmail=c('c','d'), email2=c('e','f')), "test.csv")
fread("test.csv", nrows=1)
#    a email1 snailmail email2
# 1: 1      a         c      e
cols <- colnames(fread("test.csv", nrows=0))
cols
# [1] "a"         "email1"    "snailmail" "email2"   
fread("test.csv", select = grep("^email", cols, value = TRUE))
#    email1 email2
# 1:      a      e
# 2:      b      f
Run Code Online (Sandbox Code Playgroud)

  • 是的,这是规范的方法,您也可以使用 `nrows=0` 来仅获取列名 (3认同)