将因子映射到数据帧

问题描述:

我的采样数据分布在两个数据集上。 loc描述了地理位置,spe包含找到的物种。 Unfortunally,采样站由两个因素(cruisestation)所描述的,所以我需要构造唯一标识符用于两个数据集将因子映射到数据帧

>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)) 

然后,我构建IDloc

loc$ID<-paste("STA",formatC(1:nrow(loc),width=4,format="d",flag="0"),sep="") 

但我如何映射到IDspe

我发现的方式涉及到两个嵌套循环,对于像我这样的程序编程人员来说是相当英俊的(如果嵌套的循环可以称为英俊的话)。我很确定R中的双线程会更高效,更快速,但我无法弄清楚。我真的想在我的代码中拥有更多的美感,这是非常不错的。

+4

+1欢迎来到*。我希望所有的新问题都能清楚地看到,包括样本数据,预期结果和工作代码! – Andrie 2012-07-13 15:32:53

其实,我觉得这就是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" 
+0

这就是要走的路。谢啦! – Janhoo 2012-07-13 15:27:10

+0

但我仍然需要唯一的标识符。不应该那么强硬 - 我会尝试。 – Janhoo 2012-07-13 15:41:02

+0

@sunpyg你可以使用'独特'和'粘贴' - 我编辑我的答案。 – Andrie 2012-07-13 15:48:00

您可以结合因素与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取得并转换成数据帧的