说我有以下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结合使用?
答案 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