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