如果这是双重发布,请提前道歉但是我没有找到解决方案来解决我想在这里工作(和学习)的问题。
我正在尝试将我的代码更改为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中使用,只有一次和特定方式。见帮助(“:=”)。
答案 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 = '.'))]}))