首页 > 解决方案 > 以分位数在 R 中按行拆分数据

问题描述

我有一个名为 fd 的 data.frame,它有 406 行和 48 列。对于 fd 中的每一行,我想计算 ntiles (sixtiles)。我这样做是通过以下方式:

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 的每一行并执行以下操作:

取 fd 第一行中第一个六分位数的所有观测值,并将它们存储到 fd1 的第一行,然后取 fd 第二行的第一个六分位数并将它们存储在 fd1 的第二行中。

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

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

标签: rdataframesplitrowquantile

解决方案


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

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

推荐阅读