我尝试使用自定义函数从一个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解决方案感兴趣 - 这是一个我想要更好理解的功能,而且我的印象是这个问题可以优雅地处理。
答案 0 :(得分:1)
apply
需要一个矩阵 - 如果它得到一个数据帧,它会将其转换为矩阵。因此,$
与apply
无关。
将代码快速转换为有效代码的一种方法是:
sapply(split(raw_DF, rownames(raw_DF)), apply.cals, cal_DF=calibrant_DF)
split(raw_df, rownames(raw_DF))
将raw_DF转换为列表,其中每个组件都是一个只有一行的数据框。 sapply
将您的函数应用于每个此类数据框。
我在这个例子中得到的是:
# 1 2 3 4
# raw12 3.3 3.1 5.1 4.2
# cal12 3.463158 3.090909 5.357895 4.20202
(我希望输出对你有意义......)