r data.table-使用字符串从n列创建汇总列

r data.table-使用字符串从n列创建汇总列,r,sum,data.table,R,Sum,Data.table,我想求和的data.table中有som数据。下面提供了一个简单的例子。我从(变量)n列(char)和一些组变量开始 我可以事先将它们(在我的示例中是nsk变量)转换为数字/整数,如果这样做的话。我希望能够使用一串columnames来创建一个新列,它是这些列的总和(nsk1-nsk3)并处理NA:s。我如何以合理的方式做到这一点 library(data.table) x <- data.table(a = c("GrpA", "GrpB"), n

我想求和的data.table中有som数据。下面提供了一个简单的例子。我从(变量)n列(char)和一些组变量开始

我可以事先将它们(在我的示例中是nsk变量)转换为数字/整数,如果这样做的话。我希望能够使用一串columnames来创建一个新列,它是这些列的总和(nsk1-nsk3)并处理NA:s。我如何以合理的方式做到这一点

library(data.table)

x <- data.table(a    = c("GrpA", "GrpB"),
                nsk1 = c("1","3"),
                nsk2 = c(NA,"1"),
                nsk3 = c("3", "4"))

ClNamesStr <- colnames(x)
ClNamesStr <- ClNamesStr[grepl("^nsk", ClNamesStr)]

nskStrSum <- paste(ClNamesStr, collapse = "),as.numeric(")
nskStrSum <- paste("as.numeric(", nskStrSum, "), na.rm = TRUE")
所需的输出如下:

a    nsk1 nsk2 nsk3 nsk0
GrpA    1   NA    3    4
GrpB    3    1    4    8
还有一条路要走

x[, nsk0 := rowSums(sapply(.SD, function(i) as.numeric(i)), na.rm=TRUE),
  .SDcols=grep("^nsk", names(x)), by = a]
返回

x
      a nsk1 nsk2 nsk3 othr nsk0
1: GrpA    1   NA    3    a    4
2: GrpA    3    1    4    b    8
sapply
运行所选变量,将每个变量转换为数字并返回矩阵。该矩阵被传递到
rowSums
,它对每行中的值求和,并忽略
NA
s
.SD
是选择data.table的缩写(除了“by”中包含的变量)。但是,使用
.SDcols
以及
grep
在其中选择变量

某些data.Tabler可能不喜欢此解决方案,因为它会将一些数据转换为矩阵。但是,这种转换在您的情况下可能是必要的

我添加了一个额外的“讨厌”变量,以表明它可以工作

数据

x <- data.table(a    = c("GrpA", "GrpA"),
                nsk1 = c("1","3"),
                nsk2 = c(NA,"1"),
                nsk3 = c("3", "4"), 
                othr = letters[1:2])

x在将“NA”替换为0后,我们可以尝试使用
Reduce

i1 <- grep("nsk", names(x))
x[, nsk0 := Reduce(`+`, lapply(.SD, function(x) 
       as.numeric(replace(x, is.na(x), 0)))), .SDcols = i1]
x
#      a nsk1 nsk2 nsk3 othr nsk0
#1: GrpA    1   NA    3    a    4
#2: GrpA    3    1    4    b    8

i1thx@lmo-意识到我可能已经让我的例子变得简单了。我还有其他列不是组变量,但不应该进行总结。ofc,我想我也可以按它们分组?你是想把一组变量逐行求和吗?请在问题中包括您想要的输出。当然-如果我用纯文本编写它,它可以工作,但是我需要从提取的colname生成sum表达式字符串,而这部分对于编辑来说也是不工作的。我猜你在那里做了什么,但在此之前没有想过与grep一起使用.SDcols,这是一个很好的接触。
i1 <- grep("nsk", names(x))
x[, nsk0 := Reduce(`+`, lapply(.SD, function(x) 
       as.numeric(replace(x, is.na(x), 0)))), .SDcols = i1]
x
#      a nsk1 nsk2 nsk3 othr nsk0
#1: GrpA    1   NA    3    a    4
#2: GrpA    3    1    4    b    8