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

时间:2016-11-25 13:30:36

标签: r sum data.table

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

我可以事先将它们(在我的例子中为nsk-vars)转换为数字/整数,如果这样的话。我希望能够使用一串列名来创建一个新列,它是这些(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")

这是我想要工作的部分。

x[, nsk0 := sum(eval(nskStrSum)), by = a]

所需的输出是:

a    nsk1 nsk2 nsk3 nsk0
GrpA    1   NA    3    4
GrpB    3    1    4    8

2 个答案:

答案 0 :(得分:1)

这是一种方法。

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的简写,(&#34; by&#34;中包含的变量除外)。但是,使用.SDcolsgrep选择变量。

一些data.tablers可能对此解决方案不满意,因为它将一些数据转换为矩阵。但是,在您的情况下,可能需要进行此转换。

我添加了额外的&#34;滋​​扰&#34;变量以表明它将起作用。

数据

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

答案 1 :(得分:1)

我们可以在更换&#39; NA&#39;之后尝试使用Reduce。用0。

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