使用data.table计算lapply中的新列

时间:2018-02-17 10:32:06

标签: r data.table

如果这是双重发布,请提前道歉但是我没有找到解决方案来解决我想在这里工作(和学习)的问题。

我正在尝试将我的代码更改为data.table方法而不是data.frame,因为速度优势,因为我正在使用每百万个值来处理数百个测量文件。

我无法弄清楚如何编写以下场景的代码: 我的列的名称由2部分组成:通道和参数如:FWS.Maximum,FWS.Minimum

由于代码必须适用于具有不同通道的仪器数据,因此我编写它以便R自动找到通道部分,然后使用lapply循环它们。 我在这里尝试做的是将Range计算为Channel.Maximum列 - channel.minimum列。

df[, FWS.Range := (FWS.Maximum - FWS.Minimum)]

工作正常,但在循环中它看起来像这样:

x <- "FWS"

mydf[ , paste(x, "Range", sep = '.') := paste(x, "Maximum", sep = '.') - paste(x, "Minimum", sep = '.')]

但是会引发以下错误:

  

粘贴错误(x,“最大”,sep =“。”) - 粘贴(x,“最小”,sep =“。”):
  二元运算符的非数字参数

只有5列的虚拟数据可以测试它(真实数据有几十个我需要根据这种风格调整)

mydf = data.table(ID = c(1,2,3,4,5), FWS.Maximum = c(12, 17,29, 22), FWS.Minimum = c(5,4,1,6),
FL.Red.Maximum = c(12, 17,29, 22), FL.Red.Minimum = c(5,4,1,6))

我试图让这个工作的代码是:

lapply(substr(names(mydf)[grepl("Maximum", names(mydf))], 1, nchar(names(mydf)[grepl("Maximum", names(mydf))])-8), function(x) { 
  mydf[ paste(x, "Range", sep = '.'):= paste(x, "Maximum", sep = '.') - paste(x, "Minimum", sep = '.')]  })

目前告诉我

  

:=中的错误(粘贴(x,“范围”,sep =“。”),粘贴(x,“最大”,sep =“。”) - :检查is.data.table( DT)== TRUE。否则,:=和:=(...)被定义为在j中使用,只有一次和特定方式。见帮助(“:=”)。

1 个答案:

答案 0 :(得分:2)

感谢MichaelChirrico和Jaap的回答,以及我自己试图停止在控制台上打印:

 invisible(lapply(list.of.channels,  function(x) {
mydf[ , paste(x, "Range", sep = '.') := get(paste(x, "Maximum", sep = '.')) - get(paste(x, "Minimum", sep = '.'))]}))