2013-07-14 102 views
0

老实说,我不确定标题是否准确地描述了发生了什么,但是在这里。Sapply正在将矢量变成矢量矢量..我想

假设我开始用下面的对象“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 ... 

这一切都很好,很棒! UNTIL ....

我调用另一个函数

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,我认为这是奇怪的。我suspision是,它来自于线

t <- 1+.02*(Tempcheck$Temp-25) 

我知道我可以做这一种不同的方式,但我试图迫使我自己使用的申请家庭,更好地了解它。无论如何,任何帮助将不胜感激。谢谢!

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

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

我一直在寻找一种方式把它变成一个功能,并适用于每个元素Tempcheck的列[[3]]

+0

您的函数'CondictivityCorrection'不显式返回任何东西。事实上,我认为你对你的两个函数都感到困惑,因为它们返回的是什么(如果有的话)。 – joran

+0

这里没有足够的信息来掌握_exactly_你的函数应该做什么,但我几乎可以肯定的是绝对没有必要在这里应用函数。我觉得这个应该都很容易做到矢量化。 – joran

+0

我知道我可以对这些操作进行矢量化,但我想我会挑战自我,想出如何正确地制作和使用功能。你会建议什么? – ZDwhite

回答

1

的问题是,Tempcheck$TempConductivityCorrection函数是一个向量所以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) 

一般来说,如果你是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)]`) 
+0

我还没有机会玩data.table包,但我会。前面的代码行很好用!问题是,我怎么会想到做这样的事情。我感觉好像在思考/去创造功能方面缺少一些东西。你可以解释一下seq_along()。再次感谢您的帮助! – ZDwhite

+0

你可以阅读'seq_along'的帮助,但是它的序列和'1:length(x)'类似,但是更安全一些。一般来说''R'和矢量化语言稍微习惯了,如果你是从一个不是的,而是继续探索和提出问题;你会到达那里。 – Justin