计算R中列中NA的前后值的平均值
Calculating average of preceeding and following values for NAs in a column in R
我有一个数据集,该数据集在某些样本中具有测量值,而在其他样本中留下 NA。在每个测量值之间是 10 个没有值的样本。我希望这十个样本的值分别是前一个和后一个测量值的平均值。数据如下所示:
重要的是,任何两个已知值之间的十个 NA 中的每一个的值都必须相同。我之前尝试使用 zoo::na.approx(RC, rule=2),但它使用自己的插值数据计算平均值,而不仅仅是两个已知值。输出应如下所示:
根据 deschen 的要求编辑:
dput(rc_report[,c(2,26)])
structure(list(sample_id = c("REFTTO_IS_211201_1_b", "ARL2108200_b",
"ARL2108201_b", "ARL2108202_b", "ARL2108203_b", "ARL2108204_b",
"ARL2108205_b", "ARL2108206_b", "ARL2108207_b", "ARL2108208_b",
"ARL2108209_b", "REFTTO_IS_211201_2", "ARL2108210_b", "ARL2108211_b",
"ARL2108212_b", "ARL2108213_b", "ARL2108214_b", "ARL2108215_b",
"ARL2108216_b", "ARL2108217_b", "ARL2108218_b", "ARL2108219_b",
"REFTTO_IS_211201_3", "REFTTO_IS_211203_1", "ARL2108220", "ARL2108221",
"ARL2108222", "ARL2108223", "ARL2108224", "ARL2108225", "ARL2108226",
"ARL2108227", "ARL2108228", "ARL2108229", "REFTTO_IS_211203_2",
"ARL2108230", "ARL2108231", "ARL2108232", "ARL2108233", "ARL2108234",
"ARL2108235", "ARL2108236", "ARL2108237", "ARL2108238", "ARL2108239",
"REFTTO_IS_211203_3", "REFTTO_IS_211206_1", "ARL2108240", "ARL2108241",
"ARL2108242", "ARL2108243", "ARL2108244", "ARL2108245", "ARL2108246",
"ARL2108247", "ARL2108248", "ARL2108249", "REFTTO_IS_211206_2",
"ARL2108250", "ARL2108251", "ARL2108252", "ARL2108253", "ARL2108254",
"ARL2108255", "ARL2108256", "ARL2108258", "ARL2108259", "REFTTO_IS_211206_3"
), response_coefficient = c("1.09785865302384", "NA", "NA", "NA",
"NA", "NA", "NA", "NA", "NA", "NA", "NA", "1.09822862814289",
"NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "1.09835314677401",
"1.09942926690693", "NA", "NA", "NA", "NA", "NA", "NA", "NA",
"NA", "NA", "NA", "1.10084276861106", "NA", "NA", "NA", "NA",
"NA", "NA", "NA", "NA", "NA", "NA", "1.10078178211056", "1.11104600880183",
"NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "1.11203467893562",
"NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "1.11344223852824"
)), class = "data.frame", row.names = c(NA, -68L))
我使用以下代码解决了这个问题。它可能效率很低,但它完成了工作。
使用最后注释中显示的数据(我们将列名称更改为更短的名称)使用 na.locf0 向前和向后取平均值。
library(dplyr)
library(zoo)
dd %>%
mutate(coef = as.numeric(ifelse(coef == "NA", NA, coef)),
coef = (na.locf0(coef) + na.locf0(coef, fromLast = TRUE)) / 2)
备注
dd <- structure(list(sample_id = c("REFTTO_IS_211201_1_b", "ARL2108200_b", "ARL2108201_b", "ARL2108202_b", "ARL2108203_b", "ARL2108204_b", "ARL2108205_b", "ARL2108206_b", "ARL2108207_b", "ARL2108208_b", "ARL2108209_b", "REFTTO_IS_211201_2", "ARL2108210_b", "ARL2108211_b", "ARL2108212_b", "ARL2108213_b", "ARL2108214_b", "ARL2108215_b", "ARL2108216_b", "ARL2108217_b", "ARL2108218_b", "ARL2108219_b", "REFTTO_IS_211201_3", "REFTTO_IS_211203_1", "ARL2108220", "ARL2108221", "ARL2108222", "ARL2108223", "ARL2108224", "ARL2108225", "ARL2108226", "ARL2108227", "ARL2108228", "ARL2108229", "REFTTO_IS_211203_2", "ARL2108230", "ARL2108231", "ARL2108232", "ARL2108233", "ARL2108234", "ARL2108235", "ARL2108236", "ARL2108237", "ARL2108238", "ARL2108239", "REFTTO_IS_211203_3", "REFTTO_IS_211206_1", "ARL2108240", "ARL2108241", "ARL2108242", "ARL2108243", "ARL2108244", "ARL2108245", "ARL2108246", "ARL2108247", "ARL2108248", "ARL2108249", "REFTTO_IS_211206_2", "ARL2108250", "ARL2108251", "ARL2108252", "ARL2108253",
"ARL2108254", "ARL2108255", "ARL2108256", "ARL2108258", "ARL2108259", "REFTTO_IS_211206_3" ),
response_coefficient = c("1.09785865302384", "NA", "NA", "NA", "NA", "NA",
"NA", "NA", "NA", "NA", "NA", "1.09822862814289", "NA", "NA", "NA", "NA",
"NA", "NA", "NA", "NA", "NA", "NA", "1.09835314677401", "1.09942926690693",
"NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA",
"1.10084276861106", "NA", "NA", "NA", "NA",
"NA", "NA", "NA", "NA", "NA", "NA", "1.10078178211056", "1.11104600880183",
"NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "1.11203467893562",
"NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "1.11344223852824" )),
class = "data.frame", row.names = c(NA, -68L))
names(dd) <- c("id", "coef")
我有一个数据集,该数据集在某些样本中具有测量值,而在其他样本中留下 NA。在每个测量值之间是 10 个没有值的样本。我希望这十个样本的值分别是前一个和后一个测量值的平均值。数据如下所示:
重要的是,任何两个已知值之间的十个 NA 中的每一个的值都必须相同。我之前尝试使用 zoo::na.approx(RC, rule=2),但它使用自己的插值数据计算平均值,而不仅仅是两个已知值。输出应如下所示:
根据 deschen 的要求编辑:
dput(rc_report[,c(2,26)]) structure(list(sample_id = c("REFTTO_IS_211201_1_b", "ARL2108200_b", "ARL2108201_b", "ARL2108202_b", "ARL2108203_b", "ARL2108204_b", "ARL2108205_b", "ARL2108206_b", "ARL2108207_b", "ARL2108208_b", "ARL2108209_b", "REFTTO_IS_211201_2", "ARL2108210_b", "ARL2108211_b", "ARL2108212_b", "ARL2108213_b", "ARL2108214_b", "ARL2108215_b", "ARL2108216_b", "ARL2108217_b", "ARL2108218_b", "ARL2108219_b", "REFTTO_IS_211201_3", "REFTTO_IS_211203_1", "ARL2108220", "ARL2108221", "ARL2108222", "ARL2108223", "ARL2108224", "ARL2108225", "ARL2108226", "ARL2108227", "ARL2108228", "ARL2108229", "REFTTO_IS_211203_2", "ARL2108230", "ARL2108231", "ARL2108232", "ARL2108233", "ARL2108234", "ARL2108235", "ARL2108236", "ARL2108237", "ARL2108238", "ARL2108239", "REFTTO_IS_211203_3", "REFTTO_IS_211206_1", "ARL2108240", "ARL2108241", "ARL2108242", "ARL2108243", "ARL2108244", "ARL2108245", "ARL2108246", "ARL2108247", "ARL2108248", "ARL2108249", "REFTTO_IS_211206_2", "ARL2108250", "ARL2108251", "ARL2108252", "ARL2108253", "ARL2108254", "ARL2108255", "ARL2108256", "ARL2108258", "ARL2108259", "REFTTO_IS_211206_3" ), response_coefficient = c("1.09785865302384", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "1.09822862814289", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "1.09835314677401", "1.09942926690693", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "1.10084276861106", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "1.10078178211056", "1.11104600880183", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "1.11203467893562", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "1.11344223852824" )), class = "data.frame", row.names = c(NA, -68L))
我使用以下代码解决了这个问题。它可能效率很低,但它完成了工作。
使用最后注释中显示的数据(我们将列名称更改为更短的名称)使用 na.locf0 向前和向后取平均值。
library(dplyr)
library(zoo)
dd %>%
mutate(coef = as.numeric(ifelse(coef == "NA", NA, coef)),
coef = (na.locf0(coef) + na.locf0(coef, fromLast = TRUE)) / 2)
备注
dd <- structure(list(sample_id = c("REFTTO_IS_211201_1_b", "ARL2108200_b", "ARL2108201_b", "ARL2108202_b", "ARL2108203_b", "ARL2108204_b", "ARL2108205_b", "ARL2108206_b", "ARL2108207_b", "ARL2108208_b", "ARL2108209_b", "REFTTO_IS_211201_2", "ARL2108210_b", "ARL2108211_b", "ARL2108212_b", "ARL2108213_b", "ARL2108214_b", "ARL2108215_b", "ARL2108216_b", "ARL2108217_b", "ARL2108218_b", "ARL2108219_b", "REFTTO_IS_211201_3", "REFTTO_IS_211203_1", "ARL2108220", "ARL2108221", "ARL2108222", "ARL2108223", "ARL2108224", "ARL2108225", "ARL2108226", "ARL2108227", "ARL2108228", "ARL2108229", "REFTTO_IS_211203_2", "ARL2108230", "ARL2108231", "ARL2108232", "ARL2108233", "ARL2108234", "ARL2108235", "ARL2108236", "ARL2108237", "ARL2108238", "ARL2108239", "REFTTO_IS_211203_3", "REFTTO_IS_211206_1", "ARL2108240", "ARL2108241", "ARL2108242", "ARL2108243", "ARL2108244", "ARL2108245", "ARL2108246", "ARL2108247", "ARL2108248", "ARL2108249", "REFTTO_IS_211206_2", "ARL2108250", "ARL2108251", "ARL2108252", "ARL2108253",
"ARL2108254", "ARL2108255", "ARL2108256", "ARL2108258", "ARL2108259", "REFTTO_IS_211206_3" ),
response_coefficient = c("1.09785865302384", "NA", "NA", "NA", "NA", "NA",
"NA", "NA", "NA", "NA", "NA", "1.09822862814289", "NA", "NA", "NA", "NA",
"NA", "NA", "NA", "NA", "NA", "NA", "1.09835314677401", "1.09942926690693",
"NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA",
"1.10084276861106", "NA", "NA", "NA", "NA",
"NA", "NA", "NA", "NA", "NA", "NA", "1.10078178211056", "1.11104600880183",
"NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "1.11203467893562",
"NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "1.11344223852824" )),
class = "data.frame", row.names = c(NA, -68L))
names(dd) <- c("id", "coef")