首页 > 解决方案 > 物种积累曲线缺失线

问题描述

我找到了一个代码(如下),将其改编为我的一组基本数据并且它有效!

在此处链接到 Ants.csv

library(readxl)
library(vegan)

data<- read_excel("C:/Users/Juan/Desktop/Raw_data/Code_source/Ants.xlsx")

ants<-data[2:16]

Curve = specaccum(ants, method = "random",permutations = 999)

plot(Curve,ci=0,ci.type=c("line"),col="red",ylab="Number of Species",main="Calitzdorp")
axis(1, at=1:10)

但是,当我使用任何其他数据时,绘图窗口会打开一个带有 x 和 y 轴但没有线条的工作表?谁能告诉我为什么我现在突然错过了一条线?下面是我的代码的副本,除了缺少该行之外,它可以工作:

在此处链接到 Ant_data_R

library(readxl)
library(vegan)

data<-read_excel("C:/Users/Juan/Desktop/Raw_data/Code_source/Ant_data_R.xlsx",sheet = "CA")

ants<-data[2:16]

Curve = specaccum(ants, method = "random",permutations = 999)

plot(Curve,ci=0,ci.type=c("line"),col="red",ylab="Number of Species",main="Calitzdorp",ylim=c(0,20))

axis(1, at=1:20)

当我查看数据框时,一切看起来都很好,所以我不认为这是因为不同的 Excel 表。

标签: r

解决方案


您的代码中有几个问题。基本上,您的错误是尝试将代码直接应用于任何数据帧,而不检查数据帧是否与示例中使用的结构相同。

让我解释一下,在这里您可以看到head您提供的两个数据的输出,因为csv我使用以下代码导入:

data <- read.table("../Ants.csv", sep = ";", header = T)
data2 <- read.table("../Ant_data_R.csv", sep = ";", header = T)

对于Ants

> head(data[1:6])
          No Sp.1 Sp.2 Sp.3 Sp.4 Sp.5
1 Transect 1    0    0    0    0    0
2 Transect 2    0    0    0    0    0
3 Transect 3    0    4    0    0    2
4 Transect 4    0    0    0    0    0
5 Transect 5    0    1    0    0    1
6 Transect 6    0    1    0    0    0

对于Ant_data_R

> head(data2[1:6])
  Site Habitat No Sp.1 Sp.2 Sp.3
1   CA       H  1   NA   NA   NA
2   CA       H  2   NA   NA   NA
3   CA       H  3   NA   NA   NA
4   CA       H  4   NA   NA   NA
5   CA       H  5   NA   NA   NA
6   CA       H  6   NA   NA   NA

如您所见,1)第二个文件的第一列中有更多描述性列。2) 在第二个文件中,缺失值用 填充,NA而不是0.

因此,在您的代码中,您不能ants <- data[2:16]像示例提供的那样直接使用,因为您将有不同的输出:

这里是第一个数据框:

ants <- data[2:16]

> head(ants[1:6])
  Sp.1 Sp.2 Sp.3 Sp.4 Sp.5 Sp.6
1    0    0    0    0    0   15
2    0    0    0    0    0    3
3    0    4    0    0    2   13
4    0    0    0    0    0   15
5    0    1    0    0    1    6
6    0    1    0    0    0    9

这里是第二个:

ants2 <- data2[2:16]

> head(ants2[1:6])
  Habitat No Sp.1 Sp.2 Sp.3 Sp.4
1       H  1   NA   NA   NA   NA
2       H  2   NA   NA   NA   NA
3       H  3   NA   NA   NA   NA
4       H  4   NA   NA   NA   NA
5       H  5   NA   NA   NA   NA
6       H  6   NA   NA   NA   NA

如您所见,输出非常不同。在第一个数据帧中,它将选择与specaccum函数兼容的数值,但在第二种情况下,您将拥有字符值和 NA。

因此,解决方案是仅过滤和选择感兴趣的列。我们可以使用dplyr(存在其他方式)来做到这一点:

library(vegan)
library(tidyverse)
ants2 <- data2 %>% filter(., Site == "CA") %>% select(., contains("Sp.")) %>% replace(is.na(.),0)

现在的输出ants2看起来像:

> head(ants2[1:6])
  Sp.1 Sp.2 Sp.3 Sp.4 Sp.5 Sp.6
1    0    0    0    0    0    0
2    0    0    0    0    0    0
3    0    0    0    0    0    0
4    0    0    0    0    0    0
5    0    0    0    0    0    0
6    0    0    0    0    0    0

如果你正在应用这个specaccum函数并且你正在绘制它们,你会得到:

Curve = specaccum(ants, method = "random",permutations = 999)
Curve2 = specaccum(ants2, method = "random",permutations = 999)

plot(Curve,ci=0,ci.type=c("line"),col="red",ylab="Number of Species",main="Calitzdorp", ylim = c(2,15))
axis(1, at=1:10)
lines(Curve2,ci=0,ci.type=c("line"),col="blue")
legend("topleft", legend = c("Ants", "Ants_data_R"), col = c("red","blue"), bty = F, lty = 1)

在此处输入图像描述

希望它可以帮助您找出处理第二个数据帧的错误。让我知道它是否是您正在寻找的东西。


推荐阅读