老实说,我不确定这个标题是否准确地描述了正在发生的事情,但现在就这样了。
假设我从以下对象“Tempcheck”开始
> str(Tempcheck)
'data.frame': 1872 obs. of 3 variables:
$ Time : POSIXlt, format: "2013-07-10 14:26:40" "2013-07-10 14:26:43" "2013-07-10 14:26:50" "2013-07-10 14:26:53" ...
$ rawTemp : int 107461 108551 109940 110258 110740 110890 111096 111164 111238 111296 ...
$ rawConductivity: int 969903 1287631 1298627 1292063 1303909 1297249 1305610 1297557 1305070 1298703 ...
然后我调用一个函数并使用sapply来规范化一些数据。
TCalibration<- function(x){ #this function normalizes data based on the calculated y intercept and slope
dc <- (x*((Tempcor[[2]])))+((Tempcor[[1]])) # y = 1/m*x + -1/b
dc <- dc[[1]]
}
##calibrates rawTemp into real temp
Tempcheck$Temp <- sapply(Tempcheck[[2]],TCalibration)
Tempcor是一个先前的对象,它存储来自线性模型的系数。如果这是相关的,我可以稍后发布。
> str(Tempcheck)
'data.frame': 1872 obs. of 4 variables:
$ Time : POSIXlt, format: "2013-07-10 14:26:40" ...
$ rawTemp : int 107461 108551 109940 110258 110740 110890 111096 111164 111238 111296 ...
$ rawConductivity: int 969903 1287631 1298627 1292063 1303909 1297249 1305610 1297557 1305070 1298703 ...
$ Temp : num 23.6 23.9 24.3 24.4 24.5 ...
这一切都很好,花花公子!直到....
我称之为另一个功能
ConductivityCorrection <- function(x){
t <- 1+.02*(Tempcheck$Temp-25)
EC25 <- (x/t)
}
然后再次使用sapply到Tempcheck
Tempcheck$rawCEC <-sapply(Tempcheck[[3]] ,ConductivityCorrection)
我期望得到与前一行代码相同的东西,但发生了一些奇怪的事情。
str(Tempcheck$rawCEC)
num [1:1872, 1:1872] 998390 991974 983917 982090 979335 ...
这个载体的长度是1872 ^ 2,我认为这是奇怪的。我的怀疑是它来自行
t <- 1+.02*(Tempcheck$Temp-25)
我知道我可以用不同的方式做到这一点,但我试图强迫自己使用申请家庭并更好地学习。无论如何,任何帮助将不胜感激。谢谢!
我知道这段代码解决了我的问题。
Tempcheck$alphaT <- 1+.02*(Tempcheck$Temp-25)
Tempcheck$rawCEC <- Tempcheck[[3]]/Tempcheck$alphaT
我正在寻找一种方法将其转换为函数并应用于Tempcheck [[3]]
列中的每个元素答案 0 :(得分:1)
问题在于Tempcheck$Temp
函数中的ConductivityCorrection
是一个向量,因此t
是一个向量,因此x/t
也会返回一个向量。相反,您可以使用mapply
或sapply(seq_along(Tempcheck[[3]]), ...)
并相应地对其进行索引。
ConductivityCorrection <- function(x){
t <- 1+.02*(Tempcheck$Temp[x]-25)
EC25 <- (Tempcheck$rawConductivity[x]/t)
}
sapply(seq_along(Tempcheck$Temp, ConductivityCorrection)
通常,如果您将apply
函数添加到data.frame中的每一行,您可以对您的解决方案进行矢量化并完全跳过apply
个函数:
Temcheck$Temp <- Tempcheck$rawTemp * Tempcor[[2]] + Tempcor[[1]]
Tempcheck$rawCEC <- Tempcheck$rawConductivity / (1 + 0.02 * (Tempcheck$Temp - 25))
但是,对于像这样的简单函数,我真的很喜欢data.table
语法:
DT <- data.table(Tempcheck)
DT[, rawCEC := rawConductivity / (1 + 0.02*Temp - 25)]`)