我想在R中创建一个函数,该函数可以应用于生物学数据以进行尺寸校正。我的数据如下所示:
结构(列表(ID =结构(c(1L,12L,23L,34L,45L,56L,66L,67L,68L,2L,3L,4L,5L,6L,7L,8L,9L,10L,11L,13L)) ,.Label = c(“ rat1”,“ rat10”,“ rat11”,“ rat12”,“ rat13”,“ rat14”,“ rat15”,“ rat16”,“ rat17”,“ rat18”,“ rat19”, “ rat2”,“ rat20”,“ rat21”,“ rat22”,“ rat23”,“ rat24”,“ rat25”,“ rat26”,“ rat27”,“ rat28”,“ rat29”,“ rat3”,“ rat30” “,” rat31“,” rat32“,” rat33“,” rat34“,” rat35“,” rat36“,” rat37“,” rat38“,” rat39“,” rat4“,” rat40“,” rat41“, “ rat42”,“ rat43”,“rat44”,“ rat45”,“ rat46”,“ rat47”,“ rat48”,“ rat49”,“ rat5”,“ rat50”,“ rat51”,“ rat52”,“ rat53”,“ rat54”,“ rat55” ,“ rat56”,“ rat57”,“ rat58”,“ rat59”,“ rat6”,“ rat60”,“ rat61”,“ rat62”,“ rat63”,“ rat64”,“ rat65”,“ rat66”,“ rat67”,“ rat68”,“ rat7”,“ rat8”,“ rat9”),类别=“因子”),种群=结构(c(1L,1L,1L,2L,2L,2L,1L,1L,1L ,1L,1L,1L,1L,1L,1L,1L,1L,1L,1L,1L),.Label = c(“ A”,“ B”),class =“ factor”),size = c(39.72 ,46.72、38.37、40.8、46.57、35.93、51.69、40.97、45.39、43.67、43.68、39.2、45。07,42.11,46.91,45.99,42.43,41.36,42.54,38.41),特征= c(3.657,4.096,3.186,4.286,3.901,2.882,4.666,4.635,4.93,4.264,4.329,3.493,5.142,4.859,4.272 ,3.5、4.199、4.434、4.278、3.211)),row.names = c(NA,20L),class =“ data.frame”)
这里的功能:
sizecorr=function(input_data,input_trait){
x = input_data
xnew = x
xnew$size = mean(x$size)
z = lm(input_trait ~ size + population, data = x, na.action = na.exclude)
res = residuals(z)
yhat = predict(z,xnew)
m = (res+yhat)
}
但是,当我现在像这样在我的数据上运行此功能时
sizecorr(d,"trait")
我总是会收到此错误:
model.frame.default中的错误(公式= input_trait〜大小+总体,:可变长度不同(针对“大小”找到)
数据都是干净的(没有丢失的数据)并且格式正确。有人可以找出问题所在吗?
你正在将字符串输入传递给该函数。使用as.formula
或reformula
构造公式。你还真的需要这么多数据副本吗?(input_data
,x
,xnew
)。
sizecorr=function(input_data,input_trait){
x = input_data
xnew = x
xnew$size = mean(x$size)
z = lm(reformulate(c('size', 'population'), input_trait),
data = x, na.action = na.exclude)
res = residuals(z)
yhat = predict(z,xnew)
m = (res+yhat)
m
}
sizecorr(d,"trait")
哦,确实,它现在可以工作了!–我想知道的是,如果我不向函数传递字符串而是对象,为什么我的旧函数仍然无法正常工作。换句话说,如果我使用不带“”的特征,为什么我的旧功能不起作用?
如果
trait
不带“”使用,则它不是对象。尝试放入trait
控制台,看看会得到什么。好的,我知道了!因此,似乎没有比使用“ trait”作为字符串并重新制定模型简单的方法了吗?- 多谢
好的,我们将在一秒钟内接受您的回答。另一个问题:如果我现在想将函数的输出“ m”作为具有新名称的列直接绑定到“ input_data”上,为什么我不能简单地在函数sizeCorr.header <的末尾添加这两行-paste0(input_trait,“。sizeCorr”)和input_data $ sizeCorr.header <-m
您不能使用string变量
$
来添加新列。你可以做input[sizeCorr.header] <- m