2

我有一个数据框,其中有一列(物种)呈现 153 个因子水平

> out80[1:10,1:3]
    Species Plots100 Plots80
1       02      901    2091
2       03      921    2094
3       04       29      60
4       05     1255    2145
5       06      563     850
6       07       38      53
7      08S      102     144
8       09      897    1734
9       10      503    1084
10      11      134     334

我想要做的是在另一个数据框(species.tab2)的另一列(代码)中寻找这个级别的因子,并简单地在 out80 中创建另一个列,其名称与列法文名称中的该级别相关联

> head(species.tab2[,1:3])
    var code     French_name
1 ESPAR    2   CHENE PEDONCULE
2 ESPAR    3   CHENE SESSILE
3 ESPAR    3   CHENE SESSILE
4 ESPAR    3   CHENE SESSILE
5 ESPAR    4   CHENE ROUGE
6 ESPAR    5   CHENE PUBESCENT

我试过用 ifelse 或循环来做,但我无法让它工作。

所以结果会是这样的:

    Species Plots100 Plots80  Name
1       02      901    2091  CHENE PEDONCULE
2       03      921    2094  CHENE SESSILE

ETC...

编辑:以下是级别:

> out80$Species
[1] 02   03   04   05   06   07   08S  09   10   11   12P  12V  13B  13C  13G  14   15P  15S  16  
[20] 17C  17F  17O  18C  18D  18M  19   20G  20P  20X  21C  21M  21O  22C  22G  22M  22S  23A  23AB
[39] 23AF 23AM 23C  23F  23PA 23PC 23PD 23PF 23PM 23SO 23SS 24   25B  25C  25FD 25FR 25M   25R  25V 
[58] 26E  26OC 27C  27N  28   29AF 29AI 29CM 29EN 29LI 29MA 29MI 31   32   33B  33G  33N  34   36  
[77] 37   38AL 38AU 39   40   41   42   49AA 49AE 49AM 49BO 49BS 49C  49CA 49CS 49EA 49EV 49FL 49IA
[96] 49LN 49MB 49PC 49PL 49PM 49PS 49PT 49RA 49RC 49RP 49RT 49SN 49TF 49TG 51   52   53CA 53CO 53S 
[115] 54   55   56   57A  57B  58   59   61   62   63   64   65   66   67   68CC 68CE 68CJ 68CL 68CM
[134] 68EO 68PC 68PM 68SC 68SV 68TG 68TH 69   69JC 69JO 70SB 70SC 70SE 71   72V  73   74H  74J  76  
[153] 77  

> species.tab2$code
[1] 2    3    3    3    4    5    5    5    6    6    6    7    08S  9    10   10   11   12P  12V 
[20] 12V  13B  13C  13G  14   14   14   15P  15S  15S  16   17C  17F  17O  17O  18C  18C  18D  18D 
[39] 18M  19   19   20G  20P  20X  21C  21M  21O  22C  22G  22G  22M  22S  23A  23A  23AB 23AF 23AM
[58] 23C  23F  23PA 23PA 23PC 23PD 23PF 23PM 23SO 24   25B  25C  25D  25E3 25FR 25M  25R  25V  26E 
[77] 26E  26OC 27C  27N  28   29AI 29CM 29EN 29MA 29MI 29LI 31   32   33B  33G  33N  34   36   37  
[96] 38AU 38AL 39   40   41   42   49AA 49AE 49AM 49BO 49BO 49BS 49C  49CA 49CS 49EA 49EV 49FL 49IA
[115] 49LN 49MB 49PC 49PL 49PM 49PS 49PT 49RA 49RC 49RP 49RT 49SN 49TF 49TG 51   52   53CA 53CO 53S 
[134] 54   55   56   57A  57B  58   59   61   62   63   64   65   66   67   68CC 68CJ 68CL 68CM 68EO
[153] 68PC 68PM 68SC 68SV 68TG 68TH 69   69JC 69JO 70SB 70SC 70SE 71   72V  73   74H  74J  76   77

代码中存在一些重复,只是因为对于相同的代码,存在 2 或 3 个不同的法语名称。对于这些,我只想要一个名字,不管它是哪一个。

感谢您的帮助。

4

2 回答 2

4

code使用 merge ,在 out80 中创建新列后

out80$code <- gsub('^0|S$','',out80$Species)
merge(out80,species.tab2)
code Species Plots100 Plots80   var     French_name
1    2      02      901    2091 ESPAR CHENE PEDONCULE
2    3      03      921    2094 ESPAR   CHENE SESSILE
3    3      03      921    2094 ESPAR   CHENE SESSILE
4    3      03      921    2094 ESPAR   CHENE SESSILE
5    4      04       29      60 ESPAR     CHENE ROUGE
6    5      05     1255    2145 ESPAR CHENE PUBESCENT

编辑

Code and Species 与级别 01,02,.... 不匹配,因此我创建了一个新列来匹配它们。

gsub('^0([0-9])$','\\1',out80$Species)
于 2013-03-04T10:22:10.303 回答
2

一个data.table解决方案:

require(data.table)
dt1 <- data.table(out80)
# positive look ahead 
# match 0's at beginning followed by numbers 
# if found, replace all beginning 0's with ""
dt1[, key := sub("^[0]+(?=[0-9]+$)", "", Species, perl=T)]
setkey(dt1, "key")

dt2 <- data.table(species.tab2)
dt2[, code := as.character(code)]
dt2[, key := sub("^[0]+(?=[0-9]+$)", "", code, perl=T)]
setkey(dt2, "key")

merge(dt1, dt2)

#    key Species Plots100 Plots80   var code     French_name
# 1:   2      02      901    2091 ESPAR    2 CHENE_PEDONCULE
# 2:   3      03      921    2094 ESPAR    3   CHENE_SESSILE
# 3:   3      03      921    2094 ESPAR    3   CHENE_SESSILE
# 4:   3      03      921    2094 ESPAR    3   CHENE_SESSILE
# 5:   4      04       29      60 ESPAR    4     CHENE_ROUGE
# 6:   5      05     1255    2145 ESPAR    5 CHENE_PUBESCENT
于 2013-03-04T10:59:25.180 回答