将因子映射到数据帧
问题描述:
我的采样数据分布在两个数据集上。 loc
描述了地理位置,spe
包含找到的物种。 Unfortunally,采样站由两个因素(cruise
和station
)所描述的,所以我需要构造唯一标识符用于两个数据集将因子映射到数据帧
>loc
cruise station lon lat
1 TY1 A1 53.8073 6.7836
2 TY1 3 53.7757 6.7009
3 AZ7 A1 53.7764 6.6758
和
>spe
cruise station species abundance
1 TY1 A1 Ensis ensis 100
2 TY1 A1 Magelona 5
3 TY1 A1 Nemertea 17
4 TY1 3 Magelona 8
5 TY1 3 Ophelia 1200
6 AZ7 A1 Ophelia 950
7 AZ7 A1 Ensis ensis 89
8 AZ7 A1 Spio 1
我需要的是增加一个独特标识符ID
作为这样
cruise station species abundance ID
1 TY1 A1 Ensis ensis 100 STA0001
2 TY1 A1 Magelona 5 STA0001
3 TY1 A1 Nemertea 17 STA0001
4 TY1 3 Magelona 8 STA0002
5 TY1 3 Ophelia 1200 STA0002
6 AZ7 A1 Ophelia 950 STA0003
7 AZ7 A1 Ensis ensis 89 STA0003
8 AZ7 A1 Spio 1 STA0003
这里的数据
loc<-data.frame(cruise=c("TY1","TY1","AZ7"),station=c("A1",3,"A1"),lon=c(53.8073, 53.7757, 53.7764),lat=c(6.7836, 6.7009, 6.6758))
spe<-data.frame(cruise=c(rep("TY1",5),rep("AZ7",3)),station=c(rep("A1",3),rep(3,2),rep("A1",3)),species=c("Ensis ensis", "Magelona", "Nemertea", "Magelona", "Ophelia", "Ophelia","Ensis ensis", "Spio"),abundance=c(100,5,17,8,1200,950,89,1))
然后,我构建ID
为loc
loc$ID<-paste("STA",formatC(1:nrow(loc),width=4,format="d",flag="0"),sep="")
但我如何映射到ID
spe
?
我发现的方式涉及到两个嵌套循环,对于像我这样的程序编程人员来说是相当英俊的(如果嵌套的循环可以称为英俊的话)。我很确定R中的双线程会更高效,更快速,但我无法弄清楚。我真的想在我的代码中拥有更多的美感,这是非常不错的。
答
其实,我觉得这就是merge
在基础R只是工作的情况下:
merge(spe, loc, all.x=TRUE)
cruise station species abundance lon lat
1 AZ7 A1 Ophelia 950 53.7764 6.6758
2 AZ7 A1 Ensis ensis 89 53.7764 6.6758
3 AZ7 A1 Spio 1 53.7764 6.6758
4 TY1 3 Magelona 8 53.7757 6.7009
5 TY1 3 Ophelia 1200 53.7757 6.7009
6 TY1 A1 Ensis ensis 100 53.8073 6.7836
7 TY1 A1 Magelona 5 53.8073 6.7836
8 TY1 A1 Nemertea 17 53.8073 6.7836
要查找唯一标识符,使用unique()
:
unique(paste(loc$cruise, loc$station, sep="-"))
[1] "TY1-A1" "TY1-3" "AZ7-A1"
答
您可以结合因素与interaction
。
如果您对ID列的标签不感兴趣,解决方案非常简单。
loc <- within(loc, id <- interaction(cruise, station))
spe <- within(spe, id <- interaction(cruise, station))
答
为了表明这个地方因而导致(可能会感兴趣):
唯一标识ID
添加到loc
如前所述。
loc$ID<-paste("STA", formatC(1:nrow(loc), width=4, format="d", flag="0"), sep="")
提议Andrie merge(spe, loc, all.x=TRUE)
结合data.frames根据需要,消除了可能没有对应的spe
(如果这些应该被保留使用merge(spe, loc, all.x=TRUE, all.y=TRUE)
代替。
我想要一个表的loc
所有元素每个站的所有物种的丰度,这是由
as.data.frame.matrix(xtabs(abundance ~ ID + species, merge(spe, loc, all.x=T)))
Ensis ensis Magelona Nemertea Ophelia Spio
STA0001 100 5 17 0 0
STA0002 0 8 0 1200 0
STA0003 89 0 0 950 1
由于Andrie和棉先生
012取得并转换成数据帧的
+1欢迎来到*。我希望所有的新问题都能清楚地看到,包括样本数据,预期结果和工作代码! – Andrie 2012-07-13 15:32:53