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またはloopで試してみましたが、動作しません。

したがって、結果は次のようになります。

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

等...

編集:ここにレベルがあります:

> 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つの異なるフランス語の名前が存在するという事実だけで、コードにいくつかの繰り返しがあります。これらのために私は名前の1つが欲しいだけです、それがどれであるかは関係ありません。

ご協力ありがとうございました。

4

2 に答える 2

4

codeout80に新しい列を作成した後、 merge を使用します。

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 に答える