我想从向量中提取特定值,然后在我的函数中使用它们。我将在这个例子中解释它。
所有计算都在闪亮的应用中进行,此示例是简化版。
目前......
我计算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而改变价值。
非常感谢您的帮助!
答案 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))
})
这可以通过使用sapply
将Zt
应用于所有需要的值来创建矩阵,其列包含结果。通过将矩阵分配给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
我希望这会有所帮助。