我希望分类变量(行向量)的每个级别的频率表示一组93种草本植物的生态类型(3级:H,F,T),用于观察到的物种(= 1)按地点调节(3个等级:A,B,C),栖息地(3个等级:1,2,3,4)和年份(3个等级:1,2,3)。
我知道程序是通过tapply()传递的,但是杂乱的东西来自逻辑运算符,用于连接所有物种的当前物种(= 1)的分类变量(H,F,T)的水平通过列因子的组合进行调节。
这可以通过一个12 x 3列联表来概括,该表列出了每个地点(3)和栖息地(4)的每种生态类型(3)的数量。
我的数据(每个栖息地包含20行):每个物种(Sp1到Sp93)0表示缺席,1表示现在。矢量“类型”包含每个物种的生态类型。
网站,人居,新年,SP1,SP2,SP3,SP4,SP5,SP6,...,SP93
type = c(H,H,F,T,F,T,H,...... T)#长度为93的载体
提前谢谢。
我希望这有助于更好地描述我的数据对象。
data = read.csv(file =“Veg_06.csv”,header = TRUE)
data = data [1:240,-c(1,4:7)]
Ilot# 因子w / 3级别“A”,“B”,“C”:1 1 1 1 1 1 1 1 1 1 ...每个级别有4个子级别(来自“站点”),每个级别20行,加起来为80按行级划分。
网站# 因子w / 4级别“Am”,“Av”,“CP”,“CS”:2 2 2 2 2 2 2 2 2 2 ...
Sp# int [1:240] 0 0 0 0 0 0 0 0 0 0 ...缺少或存在物种时为“0”或“1”。
蔬菜# 因子w / 3水平“H”,“F”,“T”:3 3 2 2 3 1 2 1 2 1 ...表示物种类型的分类因子。
答案 0 :(得分:1)
首先,我会向Hadley Wickham撰写关于Tidy Data的论文推荐http://vita.had.co.nz/papers/tidy-data.pdf,了解如何组织数据以更好地适应分析。实质上,我们将每一行视为一次观察。
听起来基本上,您的数据是year
,site
,habitat
,quadrant
(?可能line
的集合,不确定描述),species
观察点是在该地点,栖息地,象限和年份观察到的物种。为简单起见,如果物种存在,则存在一行。
此外,还有type
的概念,它与每个物种有关。
不考虑如何将数据转换为此表单的问题,我们假设我们拥有上述表单中的数据。
> raw <- expand.grid(species=1:93, quadrant=1:20, habitat=1:4, site=1:3, year=1:3)
> head(raw)
species quadrant habitat site year
1 1 1 1 1 1
2 2 1 1 1 1
3 3 1 1 1 1
4 4 1 1 1 1
5 5 1 1 1 1
6 6 1 1 1 1
让我们拿一个小样本和一个大样本
> set.seed(100); d.small <- raw[sample(nrow(raw),20), ]
> set.seed(100); d.large <- raw[sample(nrow(raw),1000), ]
我们可以使用ftable
函数将其转换为我们想要的状态,12x4列联表,
> ftable(habitat ~ year + site, data=d.small)
habitat 1 2 3 4
year site
1 1 0 0 1 0
2 0 0 1 1
3 0 1 1 1
2 1 2 1 1 0
2 1 1 0 2
3 0 0 1 0
3 1 2 0 0 1
2 0 1 0 1
3 0 0 0 0
如果它发生在场地/栖息地混合物的两个不同象限中,这将计算两次相同的物种。我们可以丢弃栖息地并unique
- ify来计算所有这些栖息地
> ftable(habitat ~ year + site , data=unique(d.small[c('species', 'habitat','year','site')]))
要将数据转换成这样的形式,这在vanilla R中很棘手。使用tidyr
包它会变得更容易(reshape
做同样的事情)
> onerow <- data.frame(year=1, site=1, habitat=2, quadrant=3, sp1=0, sp2=1,sp3=0,sp4=0,sp5=1)
> onerow
year site habitat quadrant sp1 sp2 sp3 sp4 sp5
1 1 1 2 3 0 1 0 0 1
在这里,我假设您的数据看起来像是合理的
> subset(gather(onerow, species, present, -(year:quadrant)), present==1)
year site habitat quadrant species present
2 1 1 2 3 sp2 1
5 1 1 2 3 sp5 1
> subset(gather(onerow, species, present, -(year:quadrant)), present==1, select=-present)
year site habitat quadrant species
2 1 1 2 3 sp2
5 1 1 2 3 sp5
现在你可以进行上面的分析了。
仔细观察你的描述,我想你也希望合并一个物种类型信息的平行向量。
> set.seed(100); sp.type <- data.frame(species=1:93, type=factor(sample(1:4, 93, replace=T)))
> merge(d.small, sp.type)
species quadrant habitat site year type
1 6 16 4 2 3 2
2 27 9 2 2 2 4
3 27 8 4 2 1 4
4 32 18 1 2 2 4
5 33 18 1 1 2 2
6 45 14 4 2 2 3
7 49 6 2 3 1 1
8 54 3 3 2 1 2
9 55 2 1 1 3 3
10 56 2 4 3 1 2
11 56 1 3 1 1 2
12 57 7 2 1 2 1
13 62 18 4 2 2 3
14 70 19 1 1 2 3
15 77 2 3 3 1 4
16 80 7 3 1 2 1
17 81 17 1 1 3 2
18 82 5 2 2 3 3
19 86 9 4 1 3 3
20 87 10 3 3 2 3
现在,您可以使用上面的subset
,unique
和ftable
方法获取所需的数据。
答案 1 :(得分:0)
假设你有一个数据框(其中包括)名为“sites”,“habitats”,“years”的列:
dfrm <- data.frame( sites = sample( LETTERS[1:3], 20, replace=TRUE),
habitats= sample( factor(1:4), 20, replace=TRUE),
years = sample( factor(paste("Y",1:4, sep="_")), 20, replace=TRUE) )
然后,这将为您提供一个额外的因子模式列,用于对每行的各个级别进行编码。
dfrm$three.way.inter <- with(dfrm, interaction(sites, habitats, years))
如果您想要非填充级别,则不执行任何其他操作。如果您想要没有实例的可能级别,请使用drop = TRUE。然后,您可以在三个分类变量的各个级别内分析这些。