我在下面找到了一个代码,将其调整为适合我的基本数据,并且可以正常工作!
链接到Ants.csv here
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 here
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表不同所致。
答案 0 :(得分:1)
您的代码中遇到几个问题。基本上,您的错误是尝试直接对任何数据框应用代码,而不检查该数据框与示例中使用的结构是否相同。
让我解释一下,在这里,您将看到我使用以下代码导入的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)
希望它可以帮助您找出处理第二个数据帧时的错误。 让我知道您是否在寻找它。