Data.table按名称选择列,例如使用grepl

时间:2016-08-05 15:18:28

标签: r data.table

说我有以下data.table:

dt <- data.table("x1"=c(1:10), "x2"=c(1:10),"y1"=c(10:1),"y2"=c(10:1), desc = c("a","a","a","b","b","b","b","b","c","c"))

我希望将以&#39; x&#39;开头的列和以&#39; y&#39;开头的和列相加。目前我这样做:

dt[,.(Sumx=sum(x1,x2), Sumy=sum(y1,y2)), by=desc]

有效,但我想用&#34; x&#34;来引用所有列。或&#34; y&#34;按列名称,例如使用grepl()。

请你告诉我怎么做?我想我需要使用= FALSE,但不能让它与by = desc结合使用?

2 个答案:

答案 0 :(得分:2)

一衬垫:

melt(dt, id="desc", measure.vars=patterns("^x", "^y"), value.name=c("x","y"))[, 
  lapply(.SD, sum), by=desc, .SDcols=x:y]

长版(由@Frank提供):

首先,您可能不希望像这样存储您的数据。代替...

m = melt(dt, id="desc", measure.vars=patterns("^x", "^y"), value.name=c("x","y"))

    desc variable  x  y
 1:    a        1  1 10
 2:    a        1  2  9
 3:    a        1  3  8
 4:    b        1  4  7
 5:    b        1  5  6
 6:    b        1  6  5
 7:    b        1  7  4
 8:    b        1  8  3
 9:    c        1  9  2
10:    c        1 10  1
11:    a        2  1 10
12:    a        2  2  9
13:    a        2  3  8
14:    b        2  4  7
15:    b        2  5  6
16:    b        2  6  5
17:    b        2  7  4
18:    b        2  8  3
19:    c        2  9  2
20:    c        2 10  1

然后你可以......

setnames(m[, lapply(.SD, sum), by=desc, .SDcols=x:y], 2:3, paste0("Sum", c("x", "y")))[]
#   desc Sumx Sumy
#1:    a   12   54
#2:    b   60   50
#3:    c   38    6

有关改进您正在使用的数据结构的更多信息,请阅读tidying data

答案 1 :(得分:1)

使用mget grep是一个选项,其中grep("^x", ...)返回以x开头的列名,并使用mget获取列数据,{ {1}}结果,然后您可以计算unlist

sum