【问题标题】:Row generation, for loops and data storing行生成、循环和数据存储
【发布时间】:2014-01-07 11:33:26
【问题描述】:

我有一些复杂的数据框操作要做,但我不知道该怎么做。

这是我的数据框的一部分:

    YEAR    RN      DATE    NOM         SITE                LONG    SP               SUMNB  NB100
1   2011    RNN027  15056   ESTAGNOL    RNN027-Estagnol 02  310 Anthocharis cardamines (Linnaeus, 1758) 1   0.3225806
2   2011    RNN027  15075   ESTAGNOL    RNN027-Estagnol 02  310 Anthocharis cardamines (Linnaeus, 1758) 1   0.3225806
3   2003    RNN027  12166   ESTAGNOL    RNN027-Estagnol 03  330 Anthocharis cardamines (Linnaeus, 1758) 2   0.6060606
4   2006    RNN027  13252   ESTAGNOL    RNN027-Estagnol 03  330 Anthocharis cardamines (Linnaeus, 1758) 2   0.6060606
5   2006    RNN027  13257   ESTAGNOL    RNN027-Estagnol 03  330 Anthocharis cardamines (Linnaeus, 1758) 2   0.6060606
6   2005    RNN027  12895   ESTAGNOL    RNN027-Estagnol 01  540 Anthocharis cardamines (Linnaeus, 1758) 2   0.3703704
7   2005    RNN027  12910   ESTAGNOL    RNN027-Estagnol 01  540 Anthocharis cardamines (Linnaeus, 1758) 2   0.3703704
8   2011    RNN027  15075   ESTAGNOL    RNN027-Estagnol 01  540 Anthocharis cardamines (Linnaeus, 1758) 1   0.1851852
9   2008    RNN027  14120   ESTAGNOL    RNN027-Estagnol 05  960 Anthocharis cardamines (Linnaeus, 1758) 2   0.2083333
10  2011    RNN027  15065   ESTAGNOL    RNN027-Estagnol 05  960 Anthocharis cardamines (Linnaeus, 1758) 1   0.1041667
11  2011    RNN027  15075   ESTAGNOL    RNN027-Estagnol 05  960 Anthocharis cardamines (Linnaeus, 1758) 1   0.1041667
12  2007    RNN027  13679   ESTAGNOL    RNN027-Estagnol 05  960 Apatura ilia (Denis & Schifferm�ller, 1775) 2   0.2083333
13  2004    RNN027  12573   ESTAGNOL    RNN027-Estagnol 06  260 Aporia crataegi (Linnaeus, 1758)    2   0.7692308
14  2005    RNN027  12917   ESTAGNOL    RNN027-Estagnol 06  260 Aporia crataegi (Linnaeus, 1758)    2   0.7692308
15  2006    RNN027  13301   ESTAGNOL    RNN027-Estagnol 06  260 Aporia crataegi (Linnaeus, 1758)    2   0.7692308

这个 DF 汇编了一个时期 (YEAR) 中每一年在一堆站点 (SITE) 中对物种 (SP) 的观察。

我需要生成虚拟行以进一步计算丰度指数。对于每个现有的 YEAR*SITE*SP 组合,我需要一些虚拟行。我坚持“现有”,因为 SP 列表每年*站点都不同,我的意思是我不知道每个子集的 SP 向量的长度。

这是复杂化的第一步: 为了计算我的丰度指数,我需要通过搜索每个 YEAR*SITE 子集的第一个和最后一个日期来确定协议周期,无论物种如何。因此,为每个子集找到两个日期。

第二步: 在一个子集中,对于子集的每个 X 物种,我需要使用在第一步中找到的第一个和最后一个日期创建两行。这些行的格式必须与输入数据框(9 行)相同。因此,YEAR、RN、SITE 列将由正确的值(当前年份和站点组合)填充。 DATE 列由协议的第一个日期和最后一个日期填充,SP 由 X 物种名称填充,最后 SUMNB 和 NB100 设置为零(虚拟观察)。

我的意思是创建一个包含所有这些虚拟行(新的虚拟观察)的新数据框,以进一步将其与我的输入数据框合并。

以下是子集 YEAR=i 和 SITE=y 中名为 1 和 2 的两个物种的虚拟行示例:

    YEAR     RN      DATE        NOM         SITE    LONG   SP       SUMNB  NB100
1   YEAR i   RNN027  FIRST DATE  ESTAGNOL    SITE y  310    SPECIES 1 0     0
2   YEAR i   RNN027  LAST DATE   ESTAGNOL    SITE y  310    SPECIES 1 0     0
3   YEAR i   RNN027  FIRST DATE  ESTAGNOL    SITE y  310    SPECIES 2 0     0
4   YEAR i   RNN027  LAST DATE   ESTAGNOL    SITE y  310    SPECIES 2 0     0

以下是我认为必要的步骤:

  • 1- 创建一个空数据框以收集行
  • 2- 子集 YEAR*SITE 组合(可能是 applyfunction 或 function call
  • 3- 子集的最小和最大 DATE 值
  • 4- 为每个子集执行一个 for 循环(1 到 SP 列表的长度)
  • 5- 在循环中,创建两行,从输入 DF 收集数据,以便用向量的当前值填充所有列。必须在最短和最长日期内完成。
  • 6- 用输出填充空数据框。

我希望它足够清楚!如果有必要,我会解释更多。

感谢您的帮助!

编辑:这是我的数据集前 50 行的 dput,但它是很长的代码块:

> dput(head(AGG100,50))
structure(list(YEAR = structure(c(18L, 18L, 10L, 13L, 13L, 12L, 
12L, 18L, 15L, 18L, 18L, 14L, 11L, 12L, 13L, 16L, 16L, 17L, 17L, 
17L, 12L, 12L, 12L, 13L, 13L, 13L, 18L, 13L, 12L, 12L, 12L, 12L, 
13L, 13L, 13L, 14L, 14L, 15L, 15L, 17L, 17L, 17L, 18L, 10L, 11L, 
12L, 12L, 12L, 13L, 13L), .Label = c("1994", "1995", "1996", 
"1997", "1998", "1999", "2000", "2001", "2002", "2003", "2004", 
"2005", "2006", "2007", "2008", "2009", "2010", "2011", "2012"
), class = "factor"), RN = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = c("RNN027", 
"RNN037", "RNN044", "RNN046", "RNN060", "RNN066", "RNN068", "RNN078", 
"RNN079", "RNN089", "RNN130", "RNN144", "RNN157", "RNR117", "RNR189"
), class = "factor"), DATE = structure(c(15056, 15075, 12166, 
13252, 13257, 12895, 12910, 15075, 14120, 15065, 15075, 13679, 
12573, 12917, 13301, 14383, 14393, 14741, 14750, 14761, 12917, 
12925, 12930, 13279, 13286, 13295, 15106, 13286, 12917, 12925, 
12930, 12937, 13271, 13286, 13295, 13644, 13655, 14013, 14029, 
14741, 14750, 14761, 15116, 12195, 12573, 12917, 12925, 12937, 
13271, 13286), class = "Date"), NOM = structure(c(7L, 7L, 7L, 
7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 
7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 
7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L), .Label = c("ANCIENNES        CARRIERES D'ORIVAL", 
"BAIE DE L'AIGUILLON (VENDEE)", "CHERINE", "COMBE LAVAUX-JEAN ROLAND", 
"COTE DE MANCY", "Espace protégé - code", "ESTAGNOL", "GRAND PIERRE ET VITAIN", 
"ILE DE LA PLATIERE", "LAC DE REMORAY", "MARAIS DE LAVOURS", 
"PETITE CAMARGUE ALSACIENNE", "PINAIL", "RAMIERES DU VAL DE DROME", 
"RAVIN DE VALBOIS", "TOURBIERE DES DAUGES"), class = "factor"), 
SITE = structure(c(3L, 3L, 4L, 4L, 4L, 2L, 2L, 2L, 6L, 6L, 
6L, 6L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 4L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 5L, 5L, 5L, 5L, 5L, 5L, 5L), .Label = c("Libellé du site", 
"RNN027-Estagnol 01", "RNN027-Estagnol 02", "RNN027-Estagnol 03", 
"RNN027-Estagnol 04", "RNN027-Estagnol 05", "RNN027-Estagnol 06", 
"RNN037-GPV 01", "RNN037-GPV 02", "RNN037-GPV 03", "RNN037-GPV 04", 
"RNN037-GPV 05", "RNN044-Pinail A", "RNN044-Pinail B", "RNN044-Pinail C", 
"RNN044-Pinail D", "RNN044-Pinail E", "RNN044-Pinail F", 
"RNN044-Pinail G", "RNN044-Pinail I", "RNN044-Pinail J", 
"RNN044-Pinail K", "RNN046-Remoray 01", "RNN046-Remoray 02", 
"RNN046-Remoray 03", "RNN046-Remoray 04", "RNN046-Remoray 05", 
"RNN046-Remoray 06", "RNN046-Remoray 07", "RNN046-Remoray 08", 
"RNN046-Remoray 09", "RNN046-Remoray 10", "RNN060-PCA Canal", 
"RNN060-PCA Heid", "RNN060-PCA Luzernière", "RNN060-PCA Mitlere-au", 
"RNN060-PCA Petite Heid", "RNN066-Valbois Ourlet bas", "RNN066-Valbois Ourlet haut", 
"RNN066-Valbois Pel Humbert", "RNN066-Valbois Pel Martin", 
"RNN066-Valbois Pel Podgo", "RNN066-Valbois Pel Podgo corniche", 
"RNN066-Valbois Pel temoin", "RNN066-Valbois Vignes parc2bas", 
"RNN066-Valbois Vignes parc2haut", "RNN066-Valbois Vignes parc3bas", 
"RNN066-Valbois Vignes parc3haut", "RNN068-Marais Lavours beon1", 
"RNN068-Marais Lavours beon2", "RNN068-Marais Lavours beon3", 
"RNN068-Marais Lavours beon4", "RNN068-Marais Lavours beon5", 
"RNN068-Marais Lavours ceyzerieu1", "RNN068-Marais Lavours culoz1", 
"RNN078-Chérine 01", "RNN078-Chérine 02", "RNN078-Chérine 03", 
"RNN078-Chérine 04", "RNN078-Chérine 05", "RNN078-Chérine 06", 
"RNN078-Chérine 07", "RNN078-Chérine 08", "RNN078-Chérine 09", 
"RNN078-Chérine 10", "RNN078-Chérine 11", "RNN078-Chérine 12", 
"RNN079-Platière 01LGRA01", "RNN079-Platière 01LGRA03", "RNN079-Platière 01LGRA04", 
"RNN079-Platière 01LGRA07", "RNN079-Platière 01LGRA08", "RNN079-Platière 01LGRA11", 
"RNN079-Platière 01LGRA12", "RNN079-Platière 01LPGO01", "RNN079-Platière 01LPGO02", 
"RNN079-Platière 01LPGO03", "RNN079-Platière 01LPGO04", "RNN079-Platière 01LPGO05", 
"RNN079-Platière 01LPGO06", "RNN079-Platière 01LPGO07", "RNN079-Platière 01LPOV01", 
"RNN079-Platière 01LPOV02", "RNN079-Platière 01LPOV03", "RNN079-Platière 01LPOV04", 
"RNN079-Platière 01LPOV05", "RNN079-Platière 01LPOV06", "RNN089-Ramières 24", 
"RNN089-Ramières 25", "RNN089-Ramières 26", "RNN089-Ramières 27", 
"RNN089-Ramières 35", "RNN089-Ramières 36", "RNN089-Ramières 37", 
"RNN089-Ramières 43", "RNN089-Ramières 46", "RNN089-Ramières 47", 
"RNN130-Baie Aiguillon Charron-Casiers-vase", "RNN130-Baie Aiguillon Charron-Mizottes-Chaînes", 
"RNN130-Baie Aiguillon Charron-Pd-Digue-mer", "RNN130-Baie Aiguillon Triaize-Mizottes", 
"RNN130-Baie Aiguillon Triaize-Pd-Digue-1", "RNN130-Baie Aiguillon Triaize-Pd-Digue-2", 
"RNN144-Dauges 01", "RNN144-Dauges 02", "RNN144-Dauges 03", 
"RNN144-Dauges 04", "RNN144-Dauges 05", "RNN144-Dauges 06", 
"RNN144-Dauges 07", "RNN144-Dauges 08", "RNN144-Dauges 09", 
"RNN144-Dauges 10", "RNN144-Dauges 11", "RNN144-Dauges 12", 
"RNN144-Dauges 13", "RNN144-Dauges 14", "RNN144-Dauges 15", 
"RNN157-Combe Lavaux 01 Sentier des crêtes", "RNN157-Combe Lavaux 02 Sentier des dalles", 
"RNN157-Combe Lavaux 03 Plain des Essoyottes partie humide", 
"RNN157-Combe Lavaux 04 Plain des Essoyottes partie sèches", 
"RNN157-Combe Lavaux 05 Pelouses de Fontenottes", "RNN157-Combe Lavaux 06 Friches parc de nuit", 
"RNN157-Combe Lavaux 07 Friches", "RNN157-Combe Lavaux 08 Friches ouverture ONF", 
"RNN157-Combe Lavaux 09 Haut du Champ Sement", "RNN157-Combe Lavaux 10 Bas du Champ Sement", 
"RNR117-TRMANCY 01", "RNR117-TRMANCY 02", "RNR117-TRMANCY 03", 
"RNR117-TRMANCY 04", "RNR117-TRMANCY 05", "RNR117-TRMANCY 06", 
"RNR189-RNR_TRACO_01", "RNR189-RNR_TRACO_02", "RNR189-RNR_TRACO_03", 
"RNR189-RNR_TRACO_04", "RNR189-RNR_TRACO_05", "RNR189-RNR_TRACO_06a", 
"RNR189-RNR_TRACO_06b", "RNR189-RNR_TRACO_07", "RNR189-RNR_TRACO_08", 
"RNR189-RNR_TRACO_09a", "RNR189-RNR_TRACO_09b", "RNR189-RNR_TRACO_10", 
"RNR189-RNR_TRACO_11", "RNR189-RNR_TRACO_12", "RNR189-RNR_TRACO_13", 
"RNR189-RNR_TRACO_14", "RNR189-RNR_TRACO_15"), class = "factor"), 
LONG = c(310, 310, 330, 330, 330, 540, 540, 540, 960, 960, 
960, 960, 260, 260, 260, 260, 260, 260, 260, 260, 310, 310, 
310, 310, 310, 310, 310, 330, 540, 540, 540, 540, 540, 540, 
540, 540, 540, 540, 540, 540, 540, 540, 540, 710, 710, 710, 
710, 710, 710, 710), SP = structure(c(2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 4L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 
8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 
8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L
), .Label = c("Aglais urticae (Linnaeus, 1758)", "Anthocharis cardamines (Linnaeus, 1758)", 
"Anthocharis euphenoides Staudinger, 1869", "Apatura ilia (Denis & Schiffermüller, 1775)", 
"Apatura iris (Linnaeus, 1758)", "Aphantopus hyperanthus (Linnaeus, 1758)", 
"Aphantopus hyperantus (Linnaeus, 1758)", "Aporia crataegi (Linnaeus, 1758)", 
"Araschnia levana (Linnaeus, 1758)", "Arethusana arethusa (Denis & Schiffermüller, 1775)", 
"Argynnis adippe (Denis & Schiffermüller, 1775)", "Argynnis aglaja (Linnaeus, 1758)", 
"Argynnis paphia (Linnaeus, 1758)", "Argynnis paphia paphia (Linnaeus, 1758)", 
"Aricia agestis (Denis & Schiffermüller, 1775)", "Aricia agestis D., 1775", 
"Boloria dia (Linnaeus, 1767)", "Boloria euphrosyne (Linnaeus, 1758)", 
"Boloria selene (Denis & Schiffermüller, 1775)", "Brenthis daphne (Bergsträsser, 1780)", 
"Brenthis ino (Rottemburg, 1775)", "Brintesia circe (Fabricius, 1775)", 
"Callophrys rubi (Linnaeus, 1758)", "Carcharodus alceae (Esper, 1780)", 
"Carcharodus floccifera (Zeller, 1847)", "Carcharodus Hübner, 1819", 
"Carcharodus lavatherae (Esper, 1783)", "Carterocephalus palaemon (Pallas, 1771)", 
"Celastrina argiolus (Linnaeus, 1758)", "Charaxes jasius (Linnaeus, 1767)", 
"Chazara briseis (Linnaeus, 1764)", "Cinclidia phoebe (Denis & Schiffermüller, 1775)", 
"Clossiana dia (Linnaeus, 1767)", "Clossiana euphrosyne (Linnaeus, 1758)", 
"Clossiana selene (Denis & Schiffermüller, 1775)", "Coenonympha arcania (Linnaeus, 1761)", 
"Coenonympha dorus (Esper, 1782)", "Coenonympha glycerion (Borkhausen, 1788)", 
"Coenonympha Hübner, 1819", "Coenonympha oedippus (Fabricius, 1787)", 
"Coenonympha pamphilus (Linnaeus, 1758)", "Coenonympha tullia (Müller, 1764)", 
"Colias alfacariensis Ribbe, 1905", "Colias crocea Geoffroy, 1785", 
"Colias croceus (Fourcroy, 1785)", "Colias Fabricius, 1807", 
"Colias hyale (Linnaeus, 1758)", "Colias palaeno (Linnaeus, 1761)", 
"Colias PC (hyale / alfacariensis) #complexe", "Cupido alcetas (Hoffmannsegg, 1804)", 
"Cupido argiades (Pallas, 1771)", "Cupido minimus (Fuessly, 1775)", 
"Cupido osiris (Meigen, 1829)", "Cyaniris semiargus (Rottemburg, 1775)", 
"Cyaniris semiargus (Rottemburg, 1775) (doublon1)", "Cynthia cardui (Linnaeus, 1758)", 
"Diacrisia sannio (Linnaeus, 1758)", "Didymaeformia didyma (Esper, 1778)", 
"Erebia aethiops (Esper, 1777)", "Erebia euryale (Esper, 1805)", 
"Erebia ligea (Linnaeus, 1758)", "Erebia medusa (Denis & Schiffermüller, 1775)", 
"Erebia meolans (de Prunner, 1798)", "Erynnis tages (Linnaeus, 1758)", 
"Euchloe crameri Butler, 1869", "Euchloe PC (ausonia / simplonia) #complexe", 
"Euclidia glyphica (Linnaeus, 1758)", "Euphydryas aurinia (Rottemburg, 1775)", 
"Euplagia quadripunctaria (Poda, 1761)", "Everes alcetas (Hoffmannsegg, 1804)", 
"Everes argiades (Pallas, 1771)", "Fabriciana adippe (Denis & Schiffermüller, 1775)", 
"Glaucopsyche alcon (Denis & Schiffermüller, 1775)", "Glaucopsyche alexis (Poda, 1761)", 
"Glaucopsyche arion (Linnaeus, 1758)", "Glaucopsyche melanops (Boisduval, 1828)", 
"Glaucopsyche nausithous (Bergsträsser, 1779)", "Glaucopsyche teleius (Bergsträsser, 1779)", 
"Gonepteryx cleopatra (Linnaeus, 1767)", "Gonepteryx rhamni (Linnaeus, 1758)", 
"Hamearis lucina (Linnaeus, 1758)", "Heodes tityrus (Poda, 1761)", 
"Hesperia comma (Linnaeus, 1758)", "Hesperia Fabricius, 1793", 
"Hesperiidae Latreille, 1809", "Heteropterus morpheus (Pallas, 1771)", 
"Hipparchia C (alcyone / genava / fagi) #complexe", "Hipparchia fagi (Scopoli, 1763)", 
"Hipparchia fidia (Linnaeus, 1767)", "Hipparchia genava (Fruhstorfer, 1908)", 
"Hipparchia semele (Linnaeus, 1758)", "Hyles euphorbiae (Linnaeus, 1758)", 
"Hyponephele lupinus (O. Costa, 1836)", "Inachis io (Linnaeus, 1758)", 
"Iphiclides podalirius (Linnaeus, 1758)", "Iphiclides podalirius (Scopoli, 1763)", 
"Issoria lathonia (Linnaeus, 1758)", "Ladoga camilla (Linnaeus, 1764)", 
"Lampides boeticus (Linnaeus, 1767)", "Lasiommata C (megera / maera) #complexe", 
"Lasiommata maera (Linnaeus, 1758)", "Lasiommata megera (Linnaeus, 1767)", 
"Leptidea Billberg, 1820", "Leptidea C (sinapis / reali) #complexe", 
"Leptidea sinapis (Linnaeus, 1758)", "Leptotes pirithous (Linnaeus, 1767)", 
"Limenitis camilla (Linnaeus, 1764)", "Limenitis Fabricius, 1807", 
"Limenitis populi (Linnaeus, 1758)", "Limenitis reducta Staudinger, 1901", 
"Lopinga achine (Scopoli, 1763)", "Lycaena alciphron (Rottemburg, 1775)", 
"Lycaena dispar (Haworth, 1802)", "Lycaena helle (Denis & Schiffermüller, 1775)", 
"Lycaena hippothoe (Linnaeus, 1761)", "Lycaena phlaeas (Linnaeus, 1761)", 
"Lycaena tityrus (Poda, 1761)", "Lycaenidae Leach, 1815", 
"Macroglossum stellatarum (Linnaeus, 1758)", "Maculinea alcon (Denis & Schiffermüller, 1775)", 
"Maculinea arion (Linnaeus, 1758)", "Maculinea Eecke, 1915", 
"Maculinea nausithous (Bergsträsser, 1779)", "Maculinea teleius (Bergsträsser, 1779)", 
"Maniola jurtina (Linnaeus, 1758)", "Melanargia arge (Sulzer, 1776)", 
"Melanargia galathea (Linnaeus, 1758)", "Melanargia lachesis (Hübner, 1790)", 
"Melanargia occitanica (Esper, 1793)", "Melitaea athalia (Rottemburg, 1775)", 
"Melitaea cinxia (Linnaeus, 1758)", "Melitaea diamina (Lang, 1789)", 
"Melitaea didyma (Esper, 1778)", "Melitaea Fabricius, 1807", 
"Melitaea parthenoides Keferstein, 1851", "Melitaea phoebe (Denis & Schiffermüller, 1775)", 
"Mellicta", "Mellicta athalia (Rottemburg, 1775)", "Mellicta C (athalia / deione / parthenoides) #complexe", 
"Mellicta parthenoides (Keferstein, 1851)", "Mesoacidalia aglaja (Linnaeus, 1758)", 
"Minois dryas (Scopoli, 1763)", "Neohipparchia statilinus (Hufnagel, 1766)", 
"Neozephyrus quercus (Linnaeus, 1758)", "Nom latin du taxon avec descripteur", 
"Nymphalis antiopa (Linnaeus, 1758)", "Nymphalis polychloros (Linnaeus, 1758)", 
"Ochlodes sylvanus (Esper, 1777)", "Ochlodes venatus (Bremer & Grey, 1853)", 
"Ochlodes venatus faunus (Turati, 1905)", "Palaeochrysophanus hippothoe Linne, 1761", 
"Papilio machaon Linnaeus, 1758", "Pararge aegeria (Linnaeus, 1758)", 
"Pieris 2 (rapae / mannii / napi) #complexe", "Pieris brassicae (Linnaeus, 1758)", 
"Pieris mannii (Mayer, 1851)", "Pieris napi (Linnaeus, 1758)", 
"Pieris napi / rapae #complexe", "Pieris PC (rapae / mannii) #complexe", 
"Pieris rapae (Linnaeus, 1758)", "Pieris Schrank, 1801", 
"Plebeius agestis (Denis & Schiffermüller, 1775)", "Plebeius argus (Linnaeus, 1758)", 
"Plebeius argyrognomon (Bergsträsser, 1779)", "Plebejus argus (Linnaeus, 1758)", 
"Plebejus argyrognomon (Bergsträsser, 1779)", "Plebejus idas (Linnaeus, 1761)", 
"Plebejus Kluk, 1802", "Polygonia c-album (Linnaeus, 1758)", 
"Polyommatus bellargus (Rottemburg, 1775)", "Polyommatus C (coridon / hispana) #complexe", 
"Polyommatus coridon (Poda, 1761)", "Polyommatus escheri (Hübner, 1823)", 
"Polyommatus icarus (Rottemburg, 1775)", "Polyommatus Latreille, 1804", 
"Polyommatus semiargus (Rottemburg, 1775)", "Polyommatus thersites (Cantener, 1835)", 
"Pontia daplidice (Linnaeus, 1758)", "Pseudopanthera macularia (Linnaeus, 1758)", 
"Pseudophilotes baton (Bergsträsser, 1779)", "Pseudotergumia fidia (Linnaeus, 1767)", 
"Pyrgus 1 C (malvae / malvoides) #complexe", "Pyrgus 2 C (armoricanus / foulquieri / alveus / onopordi) #complexe", 
"Pyrgus 3 C (serratulae / carlinae / cirsii) #complexe", 
"Pyrgus armoricanus (Oberthür, 1910)", "Pyrgus Hübner, 1819", 
"Pyrgus malvae (Linnaeus, 1758)", "Pyrgus serratulae (Rambur, 1839)", 
"Pyronia bathseba (Fabricius, 1793)", "Pyronia cecilia (Vallantin, 1894)", 
"Pyronia tithonus (Linnaeus, 1767)", "Pyronia tithonus (Linnaeus, 1771)", 
"Quercusia quercus (Linnaeus, 1758)", "Satyridae", "Satyrium acaciae (Fabricius, 1787)", 
"Satyrium esculi (Hübner, 1804)", "Satyrium ilicis (Esper, 1779)", 
"Satyrium pruni (Linnaeus, 1758)", "Satyrium spini (Denis & Schiffermüller, 1775)", 
"Satyrium w-album (Knoch, 1782)", "Smerinthus ocellatus (Linnaeus, 1758)", 
"Speyeria aglaja (Linnaeus, 1758)", "Spialia sertorius (Hoffmannsegg, 1804)", 
"Thecla betulae (Linnaeus, 1758)", "Thymelicus acteon (Rottemburg, 1775)", 
"Thymelicus acteon / lineolus / sylvestris #complexe", "Thymelicus C (sylvestris / lineolus) #complexe", 
"Thymelicus Hübner, 1819", "Thymelicus lineola (Ochsenheimer, 1808)", 
"Thymelicus sylvestris (Poda, 1761)", "Vanessa atalanta (Linnaeus, 1758)", 
"Vanessa cardui (Linnaeus, 1758)", "Zerynthia polyxena (Denis & Schiffermüller, 1775)", 
"Zygaena carniolica (Scopoli, 1763)", "Zygaena ephialtes (Linnaeus, 1767)", 
"Zygaena erythrus (Hübner, 1806)", "Zygaena Fabricius, 1775", 
"Zygaena fausta (Linnaeus, 1767)", "Zygaena filipendulae (Linnaeus, 1758)", 
"Zygaena hilaris Ochsenheimer, 1808", "Zygaena lonicerae (Scheven, 1777)", 
"Zygaena loti (Denis & Schiffermüller, 1775)", "Zygaena occitanica (Villers, 1789)", 
"Zygaena purpuralis (Brünnich, 1763)", "Zygaena sarpedon (Hübner, 1790)", 
"Zygaena transalpina (Esper, 1780)", "Zygaena trifolii (Esper, 1783)", 
"Zygaena viciae (Denis & Schiffermüller, 1775)"), class = "factor"), 
SUMNB = c(1, 1, 2, 2, 2, 2, 2, 1, 2, 1, 1, 2, 2, 2, 2, 2, 
2, 1, 2, 1, 6, 6, 4, 4, 6, 2, 1, 6, 10, 6, 12, 2, 6, 10, 
2, 4, 2, 2, 2, 2, 11, 1, 1, 2, 2, 6, 2, 2, 4, 2), NB100 = c(0.32258064516129, 
0.32258064516129, 0.606060606060606, 0.606060606060606, 0.606060606060606, 
0.37037037037037, 0.37037037037037, 0.185185185185185, 0.208333333333333, 
0.104166666666667, 0.104166666666667, 0.208333333333333, 
0.769230769230769, 0.769230769230769, 0.769230769230769, 
0.769230769230769, 0.769230769230769, 0.384615384615385, 
0.769230769230769, 0.384615384615385, 1.93548387096774, 1.93548387096774, 
1.29032258064516, 1.29032258064516, 1.93548387096774, 0.645161290322581, 
0.32258064516129, 1.81818181818182, 1.85185185185185, 1.11111111111111, 
2.22222222222222, 0.37037037037037, 1.11111111111111, 1.85185185185185, 
0.37037037037037, 0.740740740740741, 0.37037037037037, 0.37037037037037, 
0.37037037037037, 0.37037037037037, 2.03703703703704, 0.185185185185185, 
0.185185185185185, 0.28169014084507, 0.28169014084507, 0.845070422535211, 
0.28169014084507, 0.28169014084507, 0.563380281690141, 0.28169014084507
)), .Names = c("YEAR", "RN", "DATE", "NOM", "SITE", "LONG", 
"SP", "SUMNB", "NB100"), row.names = c(NA, 50L), class = "data.frame")

【问题讨论】:

  • 请使用dput 提供可重现的示例。
  • 您对自己想做的事情有非常具体的想法。但是,也许最好退后一步,让其他人为您的实际目标(丰度指数)选择不同(更有效)的方式。我建议相应地修改您的问题。如果你这样做,你应该遵循@SvenHohenstein 的建议。有关可重现示例的更多信息,请参阅FAQ
  • @Roland:我只是提供一些关于我将如何进行的想法,而不是必须遵循的步骤。由于我的问题有点难以理解,所以我认为这些步骤并不是没用的。
  • 但是你不告诉我们,丰度指数是怎么计算的。只是关于for 循环的一些内容,大多数有经验的 R 用户不会将其用于此类任务。相反,split-apply-combine approach(在很多不同的功能和包中实现)可能应该用于解决您的问题。
  • @Roland:我没有解释如何计算索引,因为我还在格式化步骤。由于索引使用时差,我不得不在观察前后添加虚拟数据,以免低估索引。计算索引完全是另一个问题。现在感谢 BrodieG,我可以处理公式而不是数据操作。还是谢谢!

标签: r


【解决方案1】:

data.table 非常适合这种类型的分析。语法已经习惯了,所以如果你不熟悉它,下面的代码可能很难理解,但希望结果足够引人注目,你对learning more about data.table 感兴趣。请注意,虽然下面的代码看起来很多,但其中大部分只是解释性的 cmets。大部分工作都是用四行代码完成的,本可以以清晰为代价进一步压缩:

library(data.table)
dt <- data.table(df)  # convert to data table

# step1, get min/max dates for YEAR/SITE

dt.dates <- dt[, list(DATE=range(DATE)), by=list(YEAR, SITE)]  

# Get unique set of YEAR/SITE/SP (.SD is a special data table variable that
# refers to all columns that are not otherwise referenced in the statement,
# the `by` argument essentially means split and group by YEAR, SITE, SP),
# so here I'm taking the first row of every column except `DATE` for each
# YEAR/SITE/SP combination)

dt.site.sp <- dt[, .SD[1, names(.SD)[names(.SD) != "DATE"], with=F], by=list(YEAR, SITE, SP)] 

# Join min/max dates for YEAR/SITE to YEAR/SITE/SP unique list; this will
# cause every unique YEAR/SITE/SP value to be matched to the min/max dates
# for every YEAR/SITE; note that in your data some YEAR/SITE only have one
# date.

setkey(dt.dates, YEAR, SITE) # this allows the join   
dt.final <- dt.dates[dt.site.sp, allow.cartesian=T]

# now cleanup

dt.final <- dt.final[, names(dt), with=F][order(YEAR, SITE, SP)]  # reorder columns and rows
dt.final[, SUMNB:=0]      # set value column to 0
dt.final[, NB100:=0]      # set value column to 0
dt.final[YEAR==2005]

产生:

#     YEAR     RN       DATE      NOM               SITE LONG                                      SP SUMNB NB100
#  1: 2005 RNN027 2005-04-22 ESTAGNOL RNN027-Estagnol 01  540 Anthocharis cardamines (Linnaeus, 1758)     0     0
#  2: 2005 RNN027 2005-06-03 ESTAGNOL RNN027-Estagnol 01  540 Anthocharis cardamines (Linnaeus, 1758)     0     0
#  3: 2005 RNN027 2005-04-22 ESTAGNOL RNN027-Estagnol 01  540        Aporia crataegi (Linnaeus, 1758)     0     0
#  4: 2005 RNN027 2005-06-03 ESTAGNOL RNN027-Estagnol 01  540        Aporia crataegi (Linnaeus, 1758)     0     0
#  5: 2005 RNN027 2005-05-14 ESTAGNOL RNN027-Estagnol 02  310        Aporia crataegi (Linnaeus, 1758)     0     0
#  6: 2005 RNN027 2005-05-27 ESTAGNOL RNN027-Estagnol 02  310        Aporia crataegi (Linnaeus, 1758)     0     0
#  7: 2005 RNN027 2005-05-14 ESTAGNOL RNN027-Estagnol 04  710        Aporia crataegi (Linnaeus, 1758)     0     0
#  8: 2005 RNN027 2005-06-03 ESTAGNOL RNN027-Estagnol 04  710        Aporia crataegi (Linnaeus, 1758)     0     0
#  9: 2005 RNN027 2005-05-14 ESTAGNOL RNN027-Estagnol 06  260        Aporia crataegi (Linnaeus, 1758)     0     0
# 10: 2005 RNN027 2005-05-14 ESTAGNOL RNN027-Estagnol 06  260        Aporia crataegi (Linnaeus, 1758)     0     0

【讨论】:

  • 它似乎运行良好!我对 SP 列表有一些疑问,但是在将输出与我的原始数据进行比较后,没关系。非常感谢!我忘记的最后一件事是我需要修改最小和最大日期:最小 - 7 天和最大 +7 天。由于您使用的是 range(),因此我不太确定如何做到这一点。还是谢谢!
  • 您应该能够将dt.dates 步骤替换为:dt.dates &lt;- dt[, list(DATE=c(min(DATE) - 7, max(DATE) + 7)), by=list(YEAR, SITE)]。这基本上将您的数据分成 YEAR/SITE 组,并为每个组创建一个包含 min(DATE)-7 和 max(DATE)+7 的两个长度向量,然后将其重新组合成一个数据表,每组两行添加分组列。
  • 我没有看到我在 dt.final
  • 抱歉,只是在 [ 前面少了一个 dt.final。这很有效,因为这一步只是重新排序东西,所以所有的辛苦工作都已经完成了。在答案中修复它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-07
  • 1970-01-01
  • 2021-07-01
  • 2019-12-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多