R 如何基于循环中的现有数据帧填充新数据帧

R 如何基于循环中的现有数据帧填充新数据帧,r,loops,dataframe,R,Loops,Dataframe,我想通过计算多个时间间隔的斜率来创建一个新的数据帧(b)。下面是原始数据(a)的子集和用于生成所需数据帧(b)的代码。我想分别以$RunTime 0.393-0.443、0.000-0.042和0.042-0.093的间隔确定$O2_229和$O2_空白的斜率 以下是我当前使用的代码: a <- structure(list(RunTime = c(0, 0.042, 0.093, 0.143, 0.193, 0.243, 0.293, 0.343, 0.393, 0.443, 0.49

我想通过计算多个时间间隔的斜率来创建一个新的数据帧(b)。下面是原始数据(a)的子集和用于生成所需数据帧(b)的代码。我想分别以$RunTime 0.393-0.443、0.000-0.042和0.042-0.093的间隔确定$O2_229和$O2_空白的斜率

以下是我当前使用的代码:

a <- structure(list(RunTime = c(0, 0.042, 0.093, 0.143, 0.193, 0.243, 
0.293, 0.343, 0.393, 0.443, 0.493, 0.543, 0.593, 0.643, 0.693, 
0.743, 0.793, 0.842, 0.893, 0.943), O2_229 = c(223.479, 222.774, 
222.185, 221.557, 221.335, 220.879, 220.734, 220.396, 220.295, 
219.996, 219.859, 219.407, 219.33, 218.899, 218.725, 218.495, 
218.449, 217.833, 217.805, 217.856), O2_35 = c(189.719, 189.479, 
189.063, 188.843, 188.498, 188.237, 188.262, 187.959, 187.856, 
187.786, 187.512, 187.086, 186.957, 186.874, 186.589, 186.559, 
186.312, 186.267, 186.039, 185.947), O2_230 = c(189.894, 189.326, 
188.835, 188.786, 188.296, 188.064, 187.634, 187.417, 187.001, 
187.024, 186.684, 186.488, 186.162, 185.956, 185.931, 185.701, 
185.604, 185.491, 185.22, 185.384), O2_36 = c(191.005, 190.59, 
190.155, 189.836, 189.505, 189.103, 188.751, 188.343, 188.183, 
187.785, 187.563, 187.442, 186.949, 186.684, 186.486, 186.215, 
185.942, 185.858, 185.689, 185.567), O2_Blank = c(193.543, 193.315, 
192.927, 192.846, 192.373, 191.749, 191.284, 190.876, 190.44, 
190.196, 189.89, 189.381, 189.131, 188.841, 188.647, 188.631, 
188.315, 188.358, 188.062, 188.221)), row.names = c(NA, 20L), class 
= "data.frame")

b <- data.frame("Light" = c("0%", "10%", "20%"),
            "229" = c((a$O2_229[a$RunTime == "0.443"] - 
a$O2_229[a$RunTime == "0.393"])/(0.443 - 0.393),
                      (a$O2_229[a$RunTime == "0.042"] - 
a$O2_229[a$RunTime == "0"])/(0.042 - 0),
                      (a$O2_229[a$RunTime == "0.093"] - 
a$O2_229[a$RunTime == "0.042"])/(0.093 - 0.042)),
            "Blank" = c((a$O2_Blank[a$RunTime == "0.443"] - 
a$O2_Blank[a$RunTime == "0.393"])/(102.643 - 92.043),
                      (a$O2_Blank[a$RunTime == "0.042"] - 
a$O2_Blank[a$RunTime == "0"])/(0.042 - 0),
                      (a$O2_Blank[a$RunTime == "0.093"] - 
a$O2_Blank[a$RunTime == "0.042"])/(0.093 - 0.042)))

我很确定我遗漏了一些东西:这些轻百分比-为什么你要使用这些值来计算0%线对我来说是个谜-但我认为这是你想要使用的可伸缩策略,无论是哪种方式:

library(scales)#表示百分比()
图书馆(tidyverse)
库(magrittr)#用于管道别名,如divide_by()
#> 
#>附加包:“magrittr”
#>以下对象被“package:purrr”屏蔽:
#> 
#>设置名称
#>以下对象已从“package:tidyr”屏蔽:
#> 
#>提取

a我不清楚你是如何总结的,但是<代码>运行时==“0.443”
至少以两种方式中断。由于这些值实际上是数值,因此您确实不能依靠相等性测试来匹配特定值,而是(可能)在公差范围内寻找绝对差异(例如,
abs(运行时-0.443)<1e-8
)。(为什么?请看,或者谷歌IEEE-754。这是一个困扰所有编程语言的浮点问题。)您好,谢谢您的输入。我认为更好的解释方法是:我想确定每个运行时间间隔的斜率(轻%)。那么,o2_229在光照10%(运行时为0-0.042)时的斜率是多少,依此类推,对于每种强度。您的预期输出是什么?请尝试澄清这个问题,因为它仍然非常模糊您想要实现的目标…您缺少了一个已编辑的
-很抱歉造成混淆。谢谢-当运行时间间隔长度不同时,这将如何应用?为了简单起见,我没有将其包含在示例中,但我有一些比其他示例更长的灯光%。0%的值是因为灯光在最末端关闭。i、 e.每种强度的运行时持续时间不同,只要行的顺序正确,就应该以这种方式适当处理不同的间隔大小。行与行之间的差异w.r.t.每个变量将除以行的差异w.r.t.运行时。不过,运行时(至少是行号)和灯光%之间的特定关系会有所帮助。不确定每次+10%是否合适。当然,感谢您的帮助-tidyverse的新功能。0% = 0.000-0.042, 10% = 0.042-0.093, 20% = 0.093-0.193, 30% = 0.193-0.293, 40% = 0.293-0.343, 50% = 0.343-0.443, 60% = 0.443-0.593, 70% = 0.593-0.743, 80% = 0.743-0.943. 所以他们都不一样。
Light 229           Blank
0%    -0.02820755   -0.02301887
10%   -16.78571429  -5.42857143
20%   -11.54901961  -7.60784314