r - 对固定大小的 block 进行简单平均

我是 R 的新手,正在尝试用它来处理一些光谱数据。我的数据按行排列,给定样本的每个光谱都在单独的列中。数据如下所示:

   Plant  Spec1  Spec2  Spec3  Spec4  Spec5  Spec6  Spec7  Spec8  Spec9 Spec10 Spec11 
1  samp1 0.0422 0.0475 0.0453 0.0426 0.0472 0.0527 0.0498 0.0424 0.0423 0.0434 0.0463 

我有很多植物样本(samp1samp10000)和大约 2000 spec# 读数。我想计算每个样本 5 个规范读数 block 的简单平均值(spec1 到 spec 5,然后是 spec6 到 spec10),即平均每 5 个列读数单独的行。

我考虑过转置数据,但是我随后必须通过将每个 5 block 平均值除以每株植物的平均光谱读数 (spec1-spec2000) 来标准化 5 block 简单平均数据样本。

关于我如何进行 R 编码的任何建议?

最佳答案

这是一种非常简单的方法。

首先,一些示例数据:

set.seed(1)
x <- cbind(Plant = letters[1:5],
           as.data.frame(matrix(rnorm(60), ncol = 12)))
x
#   Plant         V1         V2         V3          V4          V5          V6
# 1     a -0.6264538 -0.8204684  1.5117812 -0.04493361  0.91897737 -0.05612874
# 2     b  0.1836433  0.4874291  0.3898432 -0.01619026  0.78213630 -0.15579551
# 3     c -0.8356286  0.7383247 -0.6212406  0.94383621  0.07456498 -1.47075238
# 4     d  1.5952808  0.5757814 -2.2146999  0.82122120 -1.98935170 -0.47815006
# 5     e  0.3295078 -0.3053884  1.1249309  0.59390132  0.61982575  0.41794156
#            V7         V8         V9        V10        V11        V12
# 1  1.35867955 -0.4149946 -0.1645236 -0.7074952  0.3981059  1.9803999
# 2 -0.10278773 -0.3942900 -0.2533617  0.3645820 -0.6120264 -0.3672215
# 3  0.38767161 -0.0593134  0.6969634  0.7685329  0.3411197 -1.0441346
# 4 -0.05380504  1.1000254  0.5566632 -0.1123462 -1.1293631  0.5697196
# 5 -1.37705956  0.7631757 -0.6887557  0.8811077  1.4330237 -0.1350546

其次,找出“组”列。使用 gl 创建列组:

myBreaks <- gl(ceiling((ncol(x)-1)/5), 5)[1:(ncol(x)-1)]

我们可以在 sapply 中利用这些信息,我们可以方便地使用 rowMeans 来获取您要查找的值。

cbind(x[1], 
      sapply(levels(myBreaks), function(y) {
        rowMeans(x[-1][myBreaks == y])
      }))
#   Plant           1             2          3
# 1     a  0.18778055  0.0031074991  1.1892529
# 2     b  0.36537233 -0.1083305812 -0.4896239
# 3     c  0.05997134  0.0646204262 -0.3515075
# 4     d -0.24235365  0.2024774526 -0.2798217
# 5     e  0.47255547 -0.0007180433  0.6489845

https://stackoverflow.com/questions/17227802/

相关文章:

emacs - 在 Emacs 初始化文件中添加一个 TeX 符号

r - 有没有办法在 R 中为每个顶点分配多个标签

response - 如何在 mirth 中从另一个 channel 获得 Response

.net - 使用 "Enter"键作为分隔符拆分字符

c# - LINQ: "Types in Union or Concat are construct

MSMQ - 看不到公共(public)队列

amazon - master m3u8播放列表中的bandwidth属性是如何确定的?

text - 用负值归一化向量

emacs - 读取文件时如何识别 VT-100 转义序列

three.js - 在 three.js 中使用 ShaderMaterials 重复纹理