下面是我的示例数据框(代码和输出),其中包括我实际数据框中的相关列:
example <- data.frame(contig=c("Contig1", "Contig1", "Contig1", "Contig1", "Contig1", "Contig2", "Contig2", "Contig2", "Contig2", "Contig2", "Contig2", "Contig2", "Contig3", "Contig3", "Contig3", "Contig3", "Contig3", "Contig3", "Contig3", "Contig3"),
pos=c(500, 650, 750, 1000, 2000, 500, 4100, 5000, 5300, 6100, 6400, 7500, 600, 3800, 4500, 5000, 5500, 6100, 7000, 8000),
av=c(NA, 12, NA, NA, NA, NA, NA, 20, NA, NA, 25, NA, NA, 55, NA, NA, NA, 56, NA, NA))
当前,只有一些观测值的值为av
,而许多观测值为NA
。我想分配av
的值来替换NA
,并有两种不同的方法,我想用它们来完成,以便我可以比较这两种方法的结果稍后,但我不知道如何实现这两种方法。
首先,我想替换NA
,以便在contig
内(即数据帧应按contig
分组),如果pos
为NA
的{{1}}观测值与av
值的观测值pos
的1000范围内,则av
将被该值替换NA
中的。在同一av
上的另一个NA
(具有pos
值)的1000个内没有pos
的所有av
将保留为contig
。
第二,我要替换NA
,而前提是NA
不在pos
的1000以内,且pos
的值仍在{{ 1}}组。许多av
组只有一个观察值带有contig
,因此,这个contig
值可以替换该av
组中的所有av
(我认为NA
将执行此操作。但是,某些contig
组具有一个na.locf()
值的多个观察值,因此对于那些我想为contig
s个观察值的av
值分配一个NA
更接近其自身的av
值。
下面是示例数据帧的两种方法的期望输出。
方法1
方法2
答案 0 :(得分:0)
只需将其放入数据框即可进行估算。将方法参数更改为“ method1”或“ method2”。如果数据框不是相同的结构,它将无法正常工作,因为我已经通过列的索引引用了这些列,例如1个代表重叠群,2个代表pos,3个代表av。
impute_av = function(df, method){
sapply(1:nrow(df), function(i){
if(is.na(df[i,3])){
if(method == "method1"){
y = df[df[,1] == df[i,1] & df[,2] < df[i,2] + 1000 & df[,2] > df[i,2] - 1000, 2:3, drop=F]
} else if(method == "method2"){
y = df[df[,1] == df[i,1], 2:3, drop=F]
}
y = y[!is.na(y[,2]),,drop=F]
if(nrow(y) == 0){
df[i,3]
} else {
y[which.min(abs(y[,1] - df[i,2])), 2]
}
} else df[i,3]
})
}