我是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
我有很多植物样本(samp1
到samp10000
)和 2000 spec#读数。我想计算每个样本(spec1 to spec 5
,然后spec6 to spec10
)的5个规格读数块的简单平均值,即平均每个行的每5列读数。
我想过转置数据,但是我随后必须通过将每个5块平均值除以每个工厂的平均光谱读数(spec1-spec2000)来标准化 5块简单平均数据样品
关于如何进行R编码的任何建议?
答案 0 :(得分:2)
这是一种非常简单的方法。
首先,一些示例数据:
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