【问题标题】:Sapply is turning a vector into a vector of vectors.. I thinkSapply 正在将一个向量变成一个向量的向量。我认为
【发布时间】:2013-07-14 21:12:04
【问题描述】:

老实说,我不确定标题是否准确地描述了正在发生的事情,但就是这样。

假设我从以下对象“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)

我知道我可以用不同的方式做到这一点,但我试图强迫自己使用 apply 系列并更好地学习它。无论如何,任何帮助将不胜感激。谢谢!

我知道这段代码解决了我的问题。

    Tempcheck$alphaT <- 1+.02*(Tempcheck$Temp-25)
Tempcheck$rawCEC  <- Tempcheck[[3]]/Tempcheck$alphaT

我正在寻找一种方法将其转换为函数并应用于 Tempcheck[[3]] 列中的每个元素

【问题讨论】:

  • 您的函数CondictivityCorrection 没有明确返回任何内容。实际上,我认为您对两个函数都返回什么(如果有的话)感到困惑。
  • 这里没有足够的信息来确切地掌握你的函数应该做什么,但我几乎可以肯定绝对没有必要在这里应用函数。我确信这一切都应该很容易矢量化。
  • 我知道我可以向量化这些操作,但我想我会挑战自己,弄清楚如何正确地制作和使用函数。你有什么建议?
  • 抱歉之前的评论,弄糊涂了。我只是无法真正说出这些函数应该做什么。
  • 他们应该只对数组中的每个元素应用简单的校正算法。在第二个函数的情况下,它查看相应的温度元素以“x”对其进行归一化,然后使用该校正值来校正电导率。我希望这能回答你的问题,但我觉得它没有。

标签: r apply sapply


【解决方案1】:

问题在于ConductivityCorrection 函数中的Tempcheck$Temp 是一个向量,所以t 是一个向量,因此x/t 也返回一个向量。相反,您可以使用 mapplysapply(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)

一般来说,如果您对 data.frame 中的每一行都使用apply 函数,则可以对解决方案进行矢量化并完全跳过 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)]`)

【讨论】:

  • 我还没有机会使用 data.table 包,但我会的。上一行代码效果很好!不过问题是,我怎么会想到做这样的事情。我觉得好像我在思考/创建函数的方式上遗漏了一些东西。你能解释一下 seq_along() 吗?再次感谢您的帮助!!
  • 您可以阅读seq_along 的帮助,但它的序列类似于1:length(x),但更安全一些。 R 和矢量化语言通常需要一点时间来适应,如果你来自一个不是的语言,但继续探索和提出问题;你会到达那里的。
猜你喜欢
  • 1970-01-01
  • 2017-10-25
  • 2016-03-24
  • 2013-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多