我在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
答案 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;中包含的变量除外)。但是,使用.SDcols
和grep
选择变量。
一些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