用所选列的最小行数替换NA

问题描述

假设我有一个包含几种类型的列(字符,数字,ID,时间等)的数据框。我将提供一个简单的示例,如下所示:

m <- data.frame(LETTERS[1:10],LETTERS[15:24],runif(10),runif(10))
x<-c("Col1","Col2","Col3","Col4","Col5","Col6","Col7")
colnames(m)<-x
m<-as.data.frame(lapply(m,function(x) x[ sample(c(TRUE,NA),prob = c(0.75,0.25),size = length(x),replace = TRUE) ]))

> m
   Col1 Col2       Col3       Col4       Col5       Col6       Col7
1     A    O 0.09929126 0.40435352 0.15360830 0.03830400 0.80157985
2     B    P 0.50314123 0.81725456         NA 0.07054851 0.65521042
3     C <NA> 0.75798665         NA 0.04483692 0.54671014         NA
4     D    R 0.96825047 0.01875140 0.07383107         NA 0.04498563
5  <NA>    S 0.47079716 0.04181401 0.21423046         NA 0.55493444
6     F <NA>         NA         NA         NA 0.33702657 0.54989260
7     G    U 0.71947656         NA         NA 0.99142181 0.69548691
8  <NA> <NA> 0.90518907 0.20661633 0.65788523 0.05534330 0.78420756
9     I    W 0.79208514 0.63233902         NA 0.72085080         NA
10    J    X 0.39093317 0.97107464         NA 0.86417719 0.39890170

对于Col3-Col7,如果NA少于3个,我想将其替换为Col3-Col7中的最小行,否则将NA保留在那里。因此,我希望数据集看起来如下:

> m
   Col1 Col2       Col3       Col4       Col5       Col6       Col7
1     A    O 0.09929126 0.40435352 0.15360830 0.03830400 0.80157985
2     B    P 0.50314123 0.81725456 0.07054851 0.07054851 0.65521042
3     C <NA> 0.75798665 0.04483692 0.04483692 0.54671014 0.04483692
4     D    R 0.96825047 0.01875140 0.07383107 0.01875140 0.04498563
5  <NA>    S 0.47079716 0.04181401 0.21423046 0.04181401 0.55493444
6     F <NA>         NA         NA         NA 0.33702657 0.54989260
7     G    U 0.71947656 0.69548691 0.69548691 0.99142181 0.69548691
8  <NA> <NA> 0.90518907 0.20661633 0.65788523 0.05534330 0.78420756
9     I    W 0.79208514 0.63233902 0.63233902 0.72085080 0.63233902
10    J    X 0.39093317 0.97107464 0.39093317 0.86417719 0.39890170

因此,第6行以外的每一行的值均由第3-7列的每一行的最小值估算。

在我的实际数据集中,对于列18:27之间的每一行,如果NA少于4,则用列18:27的最小行替换,否则保留所有NA。

我尝试使用dplyr管道/突变/替换方法,但是我不确定如何对一列列进行操作(我的印象是您只能使用突变/替换来指定一列) 。我尝试过的一些逻辑,包括在if语句中

rowSums(is.na(.[18:27]))<4 & rowSums(is.na(.[18:27]))>0)

我已经在matrixStats包中看到了rowMins函数,但是我只是想知道是否可以使用dplyr / dataframe而不是矩阵来做到这一点。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)