使用矩阵,列表和嵌套循环的老派解决方案。
# some artifical data with missings
set.seed(123)
fd <- data.frame(matrix(rnorm(406*48),nrow = 406,ncol = 48))
diag(fd) <- NA
# quant
quant <- apply(fd,1,function(x)
quantile(t(x),probs = (0:6)/6,na.rm = TRUE,type = 6)
)
#matrix with selection
res <- list()
for (i in 1:6) {
mm <- matrix(NA,nrow = nrow(fd),ncol = ncol(fd)/6)
for (j in 1:nrow(fd)) {
lwr <- (quant[(i),j] < fd[j,])
upr <- (fd[j,] <= quant[(i+1),j])
if (i == 1)
z_j <- fd[j,][ upr ]
else
z_j <- fd[j,][ lwr & upr ]
z_j <- z_j[!is.na(z_j)]
mm[j,1:length(z_j)] <- sort(z_j)
}
res[[i]] <- mm
}
rm(i,mm,j,lwr,upr)
fd1 <- res[[1]]
,
以下是使用purrr
和dplyr
软件包来实现此目标的相对较短的方法:
library(dplyr)
library(purrr)
# some random example
df <- data.frame(matrix(runif(48),405,48))
df[3,5] <- NA
df[10,25:26] <- NA
quant <- apply(df,function(x) aa <- quantile(t(x),probs = c(1/6,2/6,3/6,4/6,5/6),na.rm = TRUE ))
aa <- as.data.frame(t(df))
fd1 <- map2(quant[1,],aa,function(x,y) y[y <= x] %>% .[!is.na(.)]) %>%
do.call(rbind,.)%>% as.data.frame(.)
fd2 <- pmap(list(quant[1,quant[2,aa),y,z) z[z > x & z <= y] %>% .[!is.na(.)]) %>%
do.call(rbind,.) %>% as.data.frame(.)
fd3 <- pmap(list(quant[2,quant[3,.) %>% as.data.frame(.)
fd4 <- pmap(list(quant[3,quant[4,.) %>% as.data.frame(.)
fd5 <- pmap(list(quant[4,quant[5,.) %>% as.data.frame(.)
fd6 <- map2(quant[5,y) y[y > x & y <= max(y)] %>% .[!is.na(.)]) %>%
do.call(rbind,.) %>% as.data.frame(.)
注意::最终的fd1 - fd6
数据帧中有一些重复的值(顺便说一句,这不是存储此类问题的最佳格式)可以始终使用例如unique
来过滤掉它们。
希望这会有所帮助。欢迎对答案进行任何修改。
本文链接:https://www.f2er.com/3114471.html