我正在尝试在'ddply'中使用自定义函数,以便根据预先存在的变量(CelltiterGLO)的值在我的数据框中创建一个新变量(NormViability)。 该函数用于基于变量'Concentration_nM'(0.01)的特定子级别的平均'CelltiterGLO'值创建'CelltiterGLO'的重新缩放(%)值。 因此,如果'Concentration_nM'= 0.01的'CelltiterGLO'的平均值设置为100,我想重新调整'CelltiterGLO'的所有其他值超过其他变量的级别('CTSC','Time_h'和'ExpType')
规范化功能如下:
normalize.fun = function(CelltiterGLO) {
idx = Concentration_nM==0.01
jnk = mean(CelltiterGLO[idx], na.rm = T)
out = 100*(CelltiterGLO/jnk)
return(out)
}
这是我尝试应用于我的数据帧的代码:
library("plyr")
df.bis=ddply(df,
.(CTSC, Time_h, ExpType),
transform,
NormViability = normalize.fun(CelltiterGLO))
代码运行,但当我尝试仔细检查(聚合或tapply)如果'NormViability'的平均值在'Concentration_nM'= 0.01时等于'100',我不会得到100,但是数字不同。事实是,如果我尝试通过变量'ExpType'的两个级别对我的df进行子集化,则代码会在每个分离的子集上返回正确的数字。我尝试将'ExpType'设为字符或因子,但我得到了类似的结果。 'ExpType有两个级别/值,分别是“组合”和“DoseResponse”。我无法弄清楚为什么代码不能在整个df上工作,我想知道这是否是由于两个级别的'ExpType'不包含所有其他变量的相同级别的事实,例如“ExpType”的“组合”级别缺少“Time_h”级别之一。
非常感谢您的帮助,如果Stackoverflow中已经存在答案且我无法找到答案,我会提前道歉。
米歇尔
答案 0 :(得分:-1)
我(OP)发现该函数在参数中缺少一个变量,该变量在语句中使用。只需将变量Concentration_nM
添加到自定义函数即可解决问题。
谢谢
米