【发布时间】:2020-12-16 18:04:00
【问题描述】:
假设我有一个包含多种类型列(字符、数字、ID、时间等)的数据框。我将提供一个简单的示例如下:
m <- data.frame(LETTERS[1:10], LETTERS[15:24],runif(10),runif(10),runif(10),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 而不是矩阵来做到这一点。
【问题讨论】:
标签: r dplyr tidyverse min data-manipulation