【发布时间】:2018-02-14 15:53:11
【问题描述】:
我是循环的新手,我正在努力格式化我的输出。我正在尝试将多个物种 (k) 的不同时间点 (i) 的物种丰度时间序列修改为不同的量级 (j)。对于这些选项中的每一个,我都想要一个显示随时间变化的丰度的列。
我编写了一个循环,当我手动输入 i、j 和 k 的各种值(即我得到具有正确值的单列)时,该循环可以工作,但我不知道如何正确索引输出矩阵。
一个虚拟数据集如下所示(其中 x 和 y 是不同的物种,样本数是时间):
dat<- data.frame(x = sample(1:100, 100, replace = TRUE), y = sample(1:100, 100, replace = TRUE))
对于我的循环,我还创建了一些其他对象:
length <- nrow(dat)
change <- as.matrix(seq(0.0,0.99,0.2))
change.length <- nrow(change)
以及要填充的最终矩阵(具有正确的尺寸)。 -40 在那里是因为我没有修改时间序列中的前 20 个或后 20 个丰度
final_matrix <- array(0,c(length,(((length-40)*change.length)*2))) # 2 is the number of species in this example
循环如下所示:
for(i in 1:(length-40)) {
for(j in 1:change.length){
for(k in 1:2){
timestep1 <- dat[0:(19+(i)),k] # selecting rows that will not be modified based on min + i for a given species k
timestep2 <- dat[(20+i):(length),k] # selecting rows that will be modified for any given species k (columns)
result1 <- timestep1*1 # not making any changes to the abundance data
result2 <- timestep2*change[j,1] # multiplying abundance by change (j)
resultloop<-c(result1,result2) # binding the two matrices into a single column with 100 rows
final_matrix[,i*j*k] <- resultloop
}}}
按原样索引的最终矩阵会产生不正确的列数,并产生奇怪的结果,例如全为零的列。
如何索引这个矩阵,以便每列(100 行表示随时间变化的丰度)都为 i、j 和 k 的每个值编制索引?
编辑:一个示例(模拟)虚拟数据集,用于说明我希望输出的样子:
dat<- data.frame(Spx_I1_j1 = sample(1:100, 100, replace = TRUE),
Spx_I2_j1 = sample(1:100, 100, replace = TRUE),
Spx_I3_j1 = sample(1:100, 100, replace = TRUE),
# etc...
Spx_I1_k2 = sample(1:100, 100, replace = TRUE),
Spx_I2_k2 = sample(1:100, 100, replace = TRUE),
#etc...
Spy_I1_k1 = sample(1:100, 100, replace = TRUE),
Spy_I2_k1 = sample(1:100, 100, replace = TRUE))
其中 100 个丰度值的每一列由每个修改的时间步长序列 (i) 对于每个物种 (k) 的每个幅度变化 (j) 的单独列表示。
非常感谢您在此问题上提供的任何帮助或建议。
【问题讨论】:
-
请展示预期输出的样本
-
感谢您的评论@waterling。我希望提供的虚拟数据集能够充分说明我希望最终输出的样子。如果您需要任何进一步的信息,请告诉我。
-
您将结果放入列
i*j*k。在for(k in 1:2){之后添加print(i*j*k)并查看结果应该写入哪一列。这真的是正确的列吗?您还可以在最后一个for循环中插入browser()以了解发生了什么。 -
谢谢@Roman。在我的问题中,我将输出放在
i*j*k列中,但我认为这是完全错误的。我的问题是,是否有人有解决方案允许我通过为所有循环建立索引来将所有迭代存储在列中? -
不太确定我是否理解您的问题,但我可以建议像
array(dim = c(2, length, length - 40, change.length), dimnames = list( species = c("x", "y"), sample_number = NULL, time_point = NULL, magnitude = NULL ))(多维数组)这样的东西作为更合适的数据结构吗?
标签: r for-loop indexing nested-loops