以R为单位在R中按行拆分数据

我有一个名为fd的data.frame,具有406行48列。我想为fd中的每一行计算ntile(六分位数)。我通过以下方式执行此操作:

quant <- apply(fd,1,function(x) quantile(t(x),probs = c(1/6,2/6,0.5,4/6,5/6),na.rm = TRUE ))

我现在想做的是,将原始数据分成6个新的数据帧,即fd1至fd6,其中在fd1中,我具有前六分位数的所有观测值,在fd2中,我具有第二个六分位数的所有观测值,而以此类推。同样,我想逐行执行此操作。意思是,我希望我的算法/函数查看fd的每一行并执行以下操作:

对fd1的第一行中的第一六分位数的所有观测值进行存储,并将其存储到fd1的第一行中,然后对fd2的第二行的第一六分位数进行存储,并将其存储在fd1的第二行中。

要注意的是:我没有对每一行和每一列的观察,因此在某些情况下我缺少数据(NA)

有人可以提示我如何实现这一目标吗? 提前致谢。

qq8117513 回答:以R为单位在R中按行拆分数据

使用矩阵,列表和嵌套循环的老派解决方案。

# 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]]
,

以下是使用purrrdplyr软件包来实现此目标的相对较短的方法:

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

大家都在问