r - 以分位数在 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)
有人可以提示我如何实现这一目标吗?提前致谢。
解决方案
使用矩阵、列表和嵌套循环的老式解决方案。
# 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]]
推荐阅读
- c# - 在WEB API C#、SOAP架构中,如何通过token和roles来实现授权,通过使用带有存储过程的repositories?
- assembly - 在 arm-none-eabi-gdb 模拟器中,来自程序入口点的 ldr 似乎给出了无意义的结果
- scheme - 在球拍中定义 mylength 函数
- java - 如何检查请求正文中的输入类型布尔值
- c# - 检查文本框输入自动增加数量由输入总记录确定
- ruby - 尝试一起使用 jekyll-paginate-v2 和 jekyll-multiple-language-plugin
- markdown - 双美元符号`$$`不能显示在gitbook的markdown代码块中
- php - 从 php 调用 python 脚本时打开(文件名)不起作用
- excel - Excel - 自动填充(复制)复制公式但显示原始值
- forms - Symfony / Form Type - 不以 single_text 小部件样式填充日期时间的编辑表单数据