下面是我的示例数据框(代码和输出),其中包括来自我的实际数据框的相关列:
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分组),如果具有av的pos的观察值在具有av值的观察值的1000内,则NA将被<代码>d15的值替换。在同一NA上的另一个pos(具有av值)的1000个范围内没有pos的任何contig s将保留为NA。
其次,我想替换NAs,但条件是pos不超过具有av值的pos的1000,但仍在contig组内。许多contig组将只有一个具有av值的观察值,因此此av值可以替换该contig组中的所有NA(我认为na.locf()会这样做)。但是,一些contig组有多个具有av值的观察值,因此对于这些组,我想为NA分配观察值的av值,使pos更接近它自己的pos值。
下面是示例数据帧的两种方法的期望输出。
方法1

方法2

发布于 2018-12-01 00:34:52
只需输入数据帧进行推算即可。将方法参数更改为"method1“或"method2”。如果dataframe不是相同的结构,它将不会工作,因为我已经通过索引引用了列,例如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]
})
}https://stackoverflow.com/questions/53560555
复制相似问题