【发布时间】:2014-09-02 20:12:35
【问题描述】:
我正在尝试使用自定义函数,该函数从一个 data.frame (raw_DF) 中获取一行数据,并使用来自单独 data.frame (calibrant_DF) 的校准数据,然后计算 Raw12 的校准值。我收到此错误:
cal_DF$Cal_set 中的错误:$ 运算符对原子向量无效 调用自:顶级
apply 函数似乎不喜欢以这种方式将 data.frame 传递给它,所以过去几个小时我一直在试图弄清楚是否可以使用不同的 apply 函数(例如,mapply、lapply)或一个 plyr 函数来完成我想要做的事情,但没有任何运气。有什么建议吗?
示例代码(实际函数和 DF 更复杂):
raw_DF<-data.frame("Cal_set"=c(1,2,1,2),"Raw12"=c(3.3,3.1,5.1,4.2))
calibrant_DF<-data.frame("Cal_set"=c(1,2),"b12"=c(.01,.04),"m12"=c(.95,.99))
apply.cals <- function(raw_row,cal_DF){
current_cals<-cal_DF[which(cal_DF$Cal_set==raw_row$Cal_set),]
raw12<-raw_row$Raw12
cal12<-(raw12-current_cals$b12)/current_cals$m12
outdata<-data.frame(raw12,cal12)
return(outdata)
} # End of apply.cals
calibrated_data<-apply(X=raw_DF,MARGIN=1,FUN=apply.cals,cal_DF="calibrant_DF")
我想要的输出是这样的结果的 data.frame(或我可以放入 data.frame 的东西):
raw12 cal12
3.3 3.463158
3.1 3.090909
5.1 5.357895
4.2 4.20202
感谢您的建议!
编辑 - 已解决,但是.... 如果其他人有想法,我会对 plyr 解决方案感兴趣 - 这是我想更好地理解的功能,我的印象是它可以优雅地处理这个问题。
【问题讨论】:
-
你的函数写得好像参数
cal_DF是一个data.frame(可能;可能是其他一些二维对象),但是你将"calibrant_DF"传递给它,这是一个原子字符向量,而不是data.frame。如果您尝试从全局环境中传递对象calibrant_DF,请不要引用其名称。 -
在编辑代码以删除这些引号后,我收到一个不同但类似的错误:
Error in raw_row$Cal_set : $ operator is invalid for atomic vectors Called from: '[.data.frame'(cal_DF, which(cal_DF$Cal_set == raw_row$Cal_set), ) -
您能否提供一个您想要的输出示例 - 我不能肯定地说,但我怀疑
apply是错误的功能,无论您要完成什么。 -
刚刚在上面添加了想要的结果。
标签: r function dataframe apply