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

使用派生列名对R中的data.table进行动态聚合,r,data.table,R,Data.table,我有不同列类型的data.table 我不知道以前的列名,我只想为某些类型的列(例如,数字)生成聚合。如何使用data.table实现这一点 例如,考虑下面的代码: dt <- data.table(ch=c('a','b','c'),num1=c(1,3,6), num2=1:9) 您可以使用.SDcols参数来实现它。参见示例 require(data.table) dt <- data.table(ch=c('a','b','c'), num1=c(1,3,6), num2

我有不同列类型的data.table

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

例如,考虑下面的代码:

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

您可以使用
.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)
require(data.table)

dt您可以使用
.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)
require(data.table)

dt您可以使用
.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)
require(data.table)

dt您可以使用
.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)
require(data.table)

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

数据中的
.SD
.SDcols
。表
给出了您想要的

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

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)]
}
require(data.table)

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

数据中的
.SD
.SDcols
。表
给出了您想要的

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

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)]
}
require(data.table)

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

数据中的
.SD
.SDcols
。表
给出了您想要的

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

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)]
}
require(data.table)

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

数据中的
.SD
.SDcols
。表
给出了您想要的

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

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)]
}
require(data.table)


请检查你的密码。
by
对于
lappy
mean
都没有论证。我猜他的意思是,
dt[,lappy(.SD,mean),by=chrCols,.SDcols=(numCols)]
@GopalakrishnaPalem true。在本例中,
DTfunction
返回
NULL
。请检查您的代码。
by
对于
lappy
mean
都没有论证。我猜他的意思是,
dt[,lappy(.SD,mean),by=chrCols,.SDcols=(numCols)]
@GopalakrishnaPalem true。在本例中,
DTfunction
返回
NULL
。请检查您的代码。
by
对于
lappy
mean
都没有论证。我猜他的意思是,
dt[,lappy(.SD,mean),by=chrCols,.SDcols=(numCols)]
@GopalakrishnaPalem true。在本例中,
DTfunction
返回
NULL
。请检查您的代码。
by
对于
lappy
mean
都没有论证。我猜他的意思是,
dt[,lappy(.SD,mean),by=chrCols,.SDcols=(numCols)]
@GopalakrishnaPalem true。在本例中,
DTfunction
返回
NULL
。效果很好。我将研究这个.SD工作。感谢您指出了正确的方向。快速跟进问题:如何保留
dt[,]
之后的所有列。我在dt中还有其他因子列在此之后丢失。@GopalakrishnaPalem,您希望如何查看它们?通过变量作为
?正常。问题就在这里。My dt由四列{num1、num2、ch、fac1}组成,类型为{numeric、numeric、character、factor}。我的问题是——比方说,我需要在所有数字上加+1,其他的都保持不变。因此,这是一种转变。现在多亏了你的.SDcols技巧,我可以使用
dt[,lapply(.SD,函数(x)x+1),.SDcols=c('num1','num2')]
给我的所有数字加上+1。在这个特殊的例子中,我没有使用
by
,因为它不是一个聚合(下一步我必须这样做)。但是在这个增量之后,输出中没有更多的ch或fac1列可供聚合。任何提示,请。@GopalakrishnaPalem有一个解决方案。最好是你能就此提出一个新问题,因为如果当前的问题效果很好,它就超出了范围。我将研究这个.SD工作。感谢您指出了正确的方向。快速跟进问题:如何保留
dt[,]
之后的所有列。我在dt中还有其他因子列在此之后丢失。@GopalakrishnaPalem,您希望如何查看它们?通过变量作为
?正常。问题就在这里。My dt由四列{num1、num2、ch、fac1}组成,类型为{numeric、numeric、character、factor}。我的问题是——比方说,我需要在所有数字上加+1,其他的都保持不变。因此,这是一种转变。现在多亏了你的.SDcols技巧,我可以使用
dt[,lapply(.SD,函数(x)x+1),.SDcols=c('num1','num2')]
给我的所有数字加上+1。在这个特殊的例子中,我没有使用
by
,因为它不是一个聚合(下一步我必须这样做)。但是在这个增量之后,输出中没有更多的ch或fac1列可供聚合。任何提示,请。@GopalakrishnaPalem有一个解决方案。最好是你能就此提出一个新问题,因为如果当前的问题效果很好,它就超出了范围。我将研究这个.SD工作。感谢您指出了正确的方向。快速跟进问题:如何保留
dt[,]
之后的所有列。我在dt中还有其他因子列在此之后丢失。@GopalakrishnaPalem,您希望如何查看它们?通过变量作为
?正常。问题就在这里。My dt由四列{num1、num2、ch、fac1}组成,类型为{numeric、numeric、character、factor}。我的问题是——比方说,我需要在所有数字上加+1,其他的都保持不变。因此,这是一种转变。现在多亏了你的.SDcols技巧,我可以使用
dt[,lapply(.SD,函数(x)x+1),.SDcols=c('num1','num2')]
给我的所有数字加上+1。