使用派生列名称在R中使用data.table进行动态聚合

时间:2014-03-21 05:54:50

标签: r data.table

我有不同列类型的data.table。

我不知道前面的列名,我想只为某些类型的列(比如数字)生成聚合。如何使用data.table实现这一点?

例如,请考虑以下代码:

dt <- data.table(ch=c('a','b','c'),num1=c(1,3,6), num2=1:9)

需要创建一个接受上述data.table的函数,并自动对由字符字段分组的数字字段执行计算(例如,对num1求和,对num2求和,按ch)。如何动态实现这一目标?

我们可以使用sapply(dt, is.numeric)查找数字列,但它将列名称作为字符串 - 不确定如何使用data.table插入它。感谢帮助。下面的代码给出了所需内容的想法 - 但不起作用

DoSomething <- function(dt)
{
    numCols <- names(dt)[sapply(dt, is.numeric)]
    chrCols <- names(dt)[sapply(dt, is.character)]
    dt[,list(sum(numCols[1]), mean(numCols[2])), by=(chrCols), with=F]
}

2 个答案:

答案 0 :(得分:2)

您可以使用.SDcols参数来实现它。见例。

require(data.table)

dt <- data.table(ch=c('a','b','c'), num1=c(1,3,6), num2=1:9)

DoSomething <- function(dt) {
    numCols <- names(dt)[sapply(dt, is.numeric)]
    chrCols <- names(dt)[sapply(dt, is.character)]
    dt[, list(sum(.SD[[1]]), mean(.SD[[2]])), by = chrCols, .SDcols = numCols]
}

DoSomething(dt)

答案 1 :(得分:1)

@djhurio为您的问题提供了一个很好的解决方案。

.SD中的{p> .SDcolsdata.table可以提供您想要的内容。

如果您在不同列之间执行相同的计算,则可以尝试以下代码。

require(data.table)

dt <- data.table(ch=c('a','b','c'), num1=c(1,3,6), num2=1:9)

DTfunction <- function(dt){
    numCols <- names(dt)[sapply(dt, is.numeric)]
    chrCols <- names(dt)[sapply(dt, is.character)]
    dt <- dt[, lapply(.SD, mean), by = (chrCols), .SDcols = (numCols)]
}
可爱的代码。不是吗? :)