首页 文章

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

提问于
浏览
1

如果这是双重发布,请提前道歉,但我没有找到解决方案,我正在努力在这里工作(和学习) .

我正在尝试将我的代码更改为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中使用,一次且特定方式 . 请参阅help(“:=”) .

1 回答

  • 1

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

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

相关问题