我在学习R时进行了生态研究,并试图编写一个函数来创建多个矩阵。
我的数据框如下所示:
df <- data.frame(Species = c("a", "b", "c", "a", "d", "a", "b", "c", "c", "a", "c", "b", "e"),
Count = c(2, 3, 1, 3, 4, 1, 2, 1, 1, 3, 2, 4, 1),
Haul = c(1, 1, 2, 2, 1, 3, 2, 3, 4, 1, 1, 2, 1),
Year = c(2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2001, 2001, 2001, 2001))
打印:
Species Count Haul Year
1 a 2 1 2000
2 b 3 1 2000
3 c 1 2 2000
4 a 3 2 2000
5 d 4 1 2000
6 a 1 3 2000
7 b 2 2 2000
8 c 1 3 2000
9 c 1 4 2000
10 a 3 1 2001
11 c 2 1 2001
12 b 4 2 2001
13 e 1 1 2001
我正在寻找创建一个for循环,该循环将产生矩阵并将其存储在列表中。这些矩阵将基于每年的牵引量和种类。
例如,我一直在尝试类似的东西。
for (i in sort(unique(df$Year))) {
ncol <- sort(unique(unlist(df$Species)))
nrow <- sort(unique(unlist(subset(df, Year == i, select=c("Haul")))))
mat <- matrix(0, length(nrow), length(ncol),
dimnames = list(nrow, ncol))
mat[as.matrix(df[c("Haul", "Species")])] <- df$Count
这一直没有工作。
我在寻找像这样的解决方案
list[[1]]
[["2000"]] a b c d e
1 2 3 0 4 0
2 3 2 1 0 0
3 1 0 1 0 0
4 0 0 1 0 0
[["2001"]] a b c d e
1 3 0 2 0 1
2 0 4 0 0 0
目标是使列为曾经见过的物种总数,而行为当年的特定数量。然后for循环会将矩阵堆叠在列表中。
我尝试过的主要事情是创建一个归零矩阵,并尝试用一个mat[as.matrix()]
函数填充数据,但是我一直遇到subscript out of bound
错误。
我尝试了很多方法,但我只能从网上可以中学到的东西中学习。任何帮助将不胜感激。谢谢!
考虑by
(按因子分解数据帧以在子集上运行进程的table
功能)和(按因子组合建立计数列联表的功能)。最终结果是矩阵的命名列表。
matrix_list <- by(df, df$Year, function(sub) {
mat <- table(sub$Haul, sub$Species)
mat[as.matrix(sub[c("Haul", "Species")])] <- sub$Count
return(mat)
})
matrix_list$`2000`
# a b c d e
# 1 2 3 0 4 0
# 2 3 2 1 0 0
# 3 1 0 1 0 0
# 4 0 0 1 0 0
matrix_list$`2001`
# a b c d e
# 1 3 0 2 0 1
# 2 0 4 0 0 0
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句