R:从向量中提取值并在函数中使用它们来计算差值

时间:2017-01-24 06:41:50

标签: r

我想从向量中提取特定值,然后在我的函数中使用它们。我将在这个例子中解释它。

所有计算都在闪亮的应用中进行,此示例是简化版。

目前......

我计算x轴的两个温度点之间的每个样本的时间差(使用ID列可以区分样本)(在下面的示例中x1 = 600 - >它是我闪亮的app中的反应值并且x2 = 800 - >它是常数值)。

####Sample data
data <- structure(list(id = c(1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L,2L, 2L),
               Zeit = c(0L, 180L, 360L, 420L, 600L, 604L, 0L, 180L,360L, 480L, 600L,
                        605L), Temp = c(963L, 824L, 666L, 658L, 641L,549L, 957L, 823L, 661L,
                                        660L, 642L, 562L)), .Names = c("id","Zeit", "Temp"), row.names = c(NA,
                                                                                                           12L), class = "data.frame")
####Calculating the time for x=600 (in my app it is a reactive value)
Zt <- vapply(unique(data$id), function(a){
  with(data[data$id == a,], approx(x = Temp, y = Zeit, xout = paste(600)))$y ###in my original data it is a reactive value:paste(input$t8xzeit)
}, double(1))
datat5 <- data.frame(ID = unique(data$id), Zeit= Zt)
####Calculating the time for x=800
Zt2 <- vapply(unique(data$id), function(a){
  with(data[data$id == a,], approx(x = Temp, y = Zeit, xout = paste(800)))$y
}, double(1))
datat8 <- data.frame(ID = unique(data$id), Zeit2= Zt2)
####Merging the data
datat85 <- merge(datat5,datat8,by="ID")
####Calculating the difference
datat85$delta <- (datat85$Zeit - datat85$Zeit2)

我需要做什么......

如果我们 x1 = 600 (这是无效值)和 x2 = 800 ,并且我们希望所有值介于600和800之间50,我们得到: 600,650,700,750,800。然后我需要在我的函数中使用每个值:Zt(在上面的代码中查看)为xout =...并为每个计算值创建一个新列。

有没有办法让它以某种方式自动(循环?)?每次新的Zt函数都不可能写入,因为向量中的值的数量可能会由于被动 x1而改变价值。

非常感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

您可以通过执行以下操作为给定的vals列表添加列:

data.new <- data.frame(ID = unique(data$id))
vals <- seq(600,800,by=50)
data.new[paste("Zeit",vals,sep="")] <- sapply(vals,function(xout.input) {
  vapply(unique(data$id), function(a){
    with(data[data$id == a,], approx(x = Temp, y = Zeit, xout = xout.input))$y
  }, double(1))
})

这可以通过使用sapplyZt应用于所有需要的值来创建矩阵,其列包含结果。通过将矩阵分配给paste("Zeit",vals,sep="")给出的名称列,将它们存储在新帧中。

然后

> data.new
  ID  Zeit600  Zeit650  Zeit700  Zeit750  Zeit800
1  1 601.7826 504.7059 321.2658 264.3038 207.3418
2  2 602.6250 546.6667 316.6667 261.1111 205.5556
> datat85$Zeit == data.new$Zeit600
[1] TRUE TRUE
> datat85$Zeit2 == data.new$Zeit800
[1] TRUE TRUE

我希望这会有所帮助。