将因子映射到数据帧

时间:2012-07-13 15:14:57

标签: r

我有两个数据集的采样数据。 loc描述了地理位置,spe包含找到的物种。不幸的是,采样站由两个因素(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))

然后,我为ID

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

但如何将ID映射到spe

我找到的方法涉及两个嵌套循环对于像我这样的程序程序员来说非常漂亮(如果嵌套循环可以被称为帅)。我很确定R中的双线会更高效,更快,但我无法理解。我真的希望我的代码更美观,这是非R.

3 个答案:

答案 0 :(得分:5)

实际上,我认为这是基础R中的merge正常工作的情况:

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"

答案 1 :(得分:3)

您可以将因子与interaction结合使用。

如果您对ID列的标签不感兴趣,解决方案非常简单。

loc <- within(loc, id <- interaction(cruise, station))
spe <- within(spe, id <- interaction(cruise, station))

答案 2 :(得分:0)

只是为了显示这导致的结果(可能是有意义的):

如前所述,唯一标识符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,消除了loc中可能没有spe中对应元素的所有元素(如果这些元素应该被保留,请使用{{1}相反。

我想要一张每个站点所有物种丰度的表格,通过

实现并转换为数据框架
merge(spe, loc, all.x=TRUE, all.y=TRUE)

感谢Andrie和Cotton先生