2016-08-05 2 views
1

Скажем, у меня есть следующий data.table:Таблица данных. Выбор столбцов по имени, например. используя grepl

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")) 

Я хочу суммировать столбцы, начиная с «х», а столбцы сумма, начиная с «у», по алфавиту. На данный момент я сделать это:

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

, который работает, но я хотел бы сослаться на все столбцы с «х» или «у» по именам столбцов, например, с помощью grepl().

Пожалуйста, не могли бы вы посоветовать мне, как это сделать? Я думаю, мне нужно использовать с = FALSE, но не может заставить его работать в сочетании с = desc?

ответ

1

Использование mget с grep вариант, где grep("^x", ...) возвращает имена столбцов, начиная с x и использовать mget, чтобы получить данные столбцов, unlist результат, а затем вы можете рассчитать sum:

dt[,.(Sumx=sum(unlist(mget(grep("^x", names(dt), value = T)))), 
     Sumy=sum(unlist(mget(grep("^y", names(dt), value = T))))), by=desc] 

# desc Sumx Sumy 
#1: a 12 54 
#2: b 60 50 
#3: c 38 6 
+0

Это работает, спасибо! – Pel

2

One -liner:

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

Длинная версия (by @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.

+0

@Frank Нет изменений статуса. Я был в процессе редактирования. – akrun

+1

@Frank Все в порядке, вы сделали некоторые ценные изменения. Я думал добавить «setnames», чтобы изменить его на ожидаемые OP. – akrun

+0

Да, как структурировать мои данные по-прежнему является кривой обучения! Спасибо за совет. – Pel

Смежные вопросы