我正在尝试确定哪些行具有唯一性(仅在该行中观察到的物种,而不是在我的物种矩阵的任何其他行中观察到的物种)。我设置了数据矩阵,其中列作为单独的物种,行作为单独的采样单位(在我们的例子中为横断面)。
例如,物种 1 仅在第 8 行中找到,而在数据集中的其他位置没有找到,那么我想知道第 8 行包含 1 个唯一物种。如果物种 4 也只在第 8 行中被发现,那么独特物种的数量将为 2 等。注意:我在数据集中发现的一些独特物种的丰度大于 1,这意味着它们在样带上被发现的数量更多不止一次,但它们仍然只在那条样带中被发现(仍然被认为是唯一的)。
以下是一些示例数据,其中第 3 行有两个唯一值,第 5 行有 1 个唯一值:
example_data <- data.frame(Species1 = c(1, 2, 3, 4, 5),
Species2 = c(6, 7, 8, 9, 10),
Species3 = c(0, 0, 13, 0, 0),
Species4 = c(0, 0, 0, 0, 20),
Species5 = c(0, 0, 23, 0, 0))
尝试使用 ChatGPT 但无济于事,我能够通过 VIA excel 找出该数据集确实具有唯一性。我还想出了如何让 R 告诉我哪些物种只被发现一次,但我更感兴趣的是哪些行(横断面)有独特之处以及有多少,而不是哪些物种是独特的。
此外,有没有一种方法可以列出所有行和唯一行数?对于示例数据,它将是 0,0,2,0,1。我感兴趣的是哪些行也没有唯一性(0 个唯一性)。
您可以像这样使用
colSums
+ rowSums
:
cbind(example_data,
uniques = rowSums(example_data[colSums(example_data > 0) == 1] > 0))
# Species1 Species2 Species3 Species4 Species5 uniques
# 1 1 6 0 0 0 0
# 2 2 7 0 0 0 0
# 3 3 8 13 0 23 2
# 4 4 9 0 0 0 0
# 5 5 10 0 20 0 1
要检查唯一值的位置,您可以执行以下操作:
which(example_data[colSums(example_data > 0) == 1] > 0, arr.ind = TRUE)
# row col
# [1,] 3 1
# [2,] 5 2
# [3,] 3 3
因为您感兴趣的是哪些行具有唯一性以及有多少行,而不是哪些物种是唯一的:
您可以通过首先查找哪些物种是唯一的,然后使用
which(..., ind.arr = TRUE)
: 来查找具有唯一值的行和列索引
uniques <- vapply(example_data, \(x) sum(x !=0) == 1, logical(1L))
# Species1 Species2 Species3 Species4 Species5
# FALSE FALSE TRUE TRUE TRUE
rowcol_uniques <- which(example_data[uniques] != 0, arr.ind = TRUE)
rownames(rowcol_uniques) <- names(uniques[uniques])
# row col
# Species3 3 1
# Species4 5 2
# Species5 3 3
您可以通过
table
找到有多少:
table(rowcol_uniques[,1])
# 3 5
# 2 1
在您的编辑中,您提到您想找出所有总和以及没有唯一值的总和 - 为此您可以
merge
:
anyuniques <- merge(data.frame(row = seq_len(nrow(example_data))),
as.data.frame(table(row = rowcol_uniques[,1])),
all.x = TRUE)
anyuniques[is.na(anyuniques)] <- 0
# row Freq
# 1 1 0
# 2 2 0
# 3 3 2
# 4 4 0
# 5 5 1
如果您只想返回具有唯一值的行和相应的唯一值:
ind <- apply(example_data >= 1, 2, which)
stack(ind[lengths(ind) == 1])
values ind
1 3 Species3
2 5 Species4
3 3 Species5
您可以首先
subset
对于具有“唯一”的列,lapply
与其余列进行大于零的比较,最后识别 which
。
> d |> subset(select=colSums(d > 0) == 1) |> lapply(`>`, 0) |> sapply(which)
Species3 Species4 Species5
3 5 3
要计算行中的唯一性,您可以执行以下操作:
> rowSums((d > 0)[, colSums(d > 0) < nrow(d)]) |> setNames(seq_len(nrow(d)))
1 2 3 4 5
0 0 2 0 1
数据:
> dput(d)
structure(list(Species1 = c(1, 2, 3, 4, 5), Species2 = c(6, 7,
8, 9, 10), Species3 = c(0, 0, 13, 0, 0), Species4 = c(0, 0, 0,
0, 20), Species5 = c(0, 0, 23, 0, 0)), class = "data.frame", row.names = c(NA,
-5L))