使用派生列名对R中的data.table进行动态聚合
我有不同列类型的data.table 我不知道以前的列名,我只想为某些类型的列(例如,数字)生成聚合。如何使用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
例如,考虑下面的代码:
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。