我有不同列类型的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]
}
答案 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> .SDcols
和data.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)]
}
可爱的代码。不是吗? :)