2017-10-05 8 views
1

J'ai plus d'une trame de données qui ressemble à ceci: avec de nombreuses espèces dans des colonnes que je ne rapporte pas ici. d1:sites correspondants dans différentes structures de données dans R

Year Region Sites Depth Transect Pharia pyramidatus 
2000 LP  BALLENA  5  1  0.03 
2000 LP  ISLOTES  5  1  0.20 
2000 LP  NORTE  5  1  0.10 
2000 LP  NORTE  20  1  0.00 

d2

Year Region Sites  Depth Transect Pharia pyramidatus 
2010 LP  PLAYA  5  1  0.03 
2010 LP  ISLOTES  5  1  0.20 
2010 LP  NORTE  5  1  0.10 
2010 LP  NORTE  20  1  0.00 

d3

Year Region Sites  Depth Transect Pharia pyramidatus 
2016 LP  BALLENA  5  1  0.03 
2016 LP  ISLOTES  5  1  0.20 
2016 LP  SUR   5  1  0.10 
2016 LP  NORTE  20  1  0.00 

ce que je voudrais faire est d'extraire les sites SAMES (Reef) qui sont présente seulement dans chaque années et lier les résultats dans un cadre de données qui devrait ressembler à ceci:

Year Region Reef  Depth Transect Pharia pyramidatus 
2000 LP  ISLOTES  5  1  0.20 
2000 LP  NORTE  5  1  0.10 
2000 LP  NORTE  20  1  0.00 
2010 LP  ISLOTES  5  1  0.20 
2010 LP  NORTE  5  1  0.10 
2010 LP  NORTE  20  1  0.00 
2016 LP  ISLOTES  5  1  0.20 
2016 LP  NORTE  20  1  0.00 

Merci beaucoup pour vous aider à

+0

Et par "site" vous voulez dire "Reef"? – useR

+0

De plus, 'NORTE' n'est pas présent dans' d3', alors pourquoi l'incluez-vous dans 'df' final? – useR

+0

Voir la solution pour les données mises à jour – useR

Répondre

0

Solution avec dplyr:

library(dplyr) 
rbind(df1, df2, df3) %>% 
    group_by(Reef) %>% 
    filter(n_distinct(Year) == 3) 

Résultat:

# A tibble: 8 x 6 
# Groups: Reef [2] 
    Year Region Reef Depth Transect Pharia_pyramidatus 
    <int> <fctr> <fctr> <int> <int>    <dbl> 
1 2000  LP ISLOTES  5  1    0.2 
2 2000  LP NORTE  5  1    0.1 
3 2000  LP NORTE 20  1    0.0 
4 2010  LP ISLOTES  5  1    0.2 
5 2010  LP NORTE  5  1    0.1 
6 2010  LP NORTE 20  1    0.0 
7 2016  LP ISLOTES  5  1    0.2 
8 2016  LP NORTE 20  1    0.0 

Notes:

n_distinct compte le nombre de Year distincts pour chaque Reef (depuis I group_by(Reef)). Je veux distinct_n == 3 parce que je veux retourner seulement des lignes où Reef a un record pour chaque Year, dans ce cas 3 ans. Dans un cas plus général, où il y a beaucoup plus Year « s, vous pouvez trouver d'abord la Year durée de votre dataframe et filter sur cette base, comme ce qui suit:

rbind(df1, df2, df3) %>% 
    mutate(Year_distinct = n_distinct(Year)) %>% 
    group_by(Reef) %>% 
    filter(n_distinct(Year) == Year_distinct) %>% 
    select(-Year_distinct) 

données:

df1 = read.table(text = "Year Region Reef  Depth Transect Pharia_pyramidatus 
       2000 LP  BALLENA  5  1  0.03 
       2000 LP  ISLOTES  5  1  0.20 
       2000 LP  NORTE  5  1  0.10 
       2000 LP  NORTE  20  1  0.00", header = TRUE) 

df2 = read.table(text = "Year Region Reef  Depth Transect Pharia_pyramidatus 
       2010 LP  PLAYA  5  1  0.03 
       2010 LP  ISLOTES  5  1  0.20 
       2010 LP  NORTE  5  1  0.10 
       2010 LP  NORTE  20  1  0.00", header = TRUE) 

df3 = read.table(text = "Year Region Reef  Depth Transect Pharia_pyramidatus 
       2016 LP  BALLENA  5  1  0.03 
       2016 LP  ISLOTES  5  1  0.20 
       2016 LP  SUR   5  1  0.10 
       2016 LP  NORTE   20  1  0.00", header = TRUE) 
+0

Merci pour votre réponse, il a résolu le problème, j'ai une question, comment fonctionne le n_distinct (Année) == 3? est-ce 3 à cause des trois données? –

+0

@FabioFavoretto Ajout d'une explication dans ma réponse. J'ai également ajouté une version plus générale au cas où vous ne voudriez pas coder en dur le nombre de 'Year' dans la base de données. – useR

+1

vous êtes génial! merci pour la réponse rapide et utile! –