2017-10-21 7 views
0

Mon échantillon de jeu de données est la suivante:Résumant des lignes spécifiques et l'ajouter aux lignes appariées comme un nouvel attribut wtithout en utilisant la fonction ou les boucles R

df1 <- data.frame(v1 = c(1,1,1,4,5,5,4,1,2,3,5,6,2,1,5), 
       v2 = c(11,13,3,42,15,25,44,13,21,73,65,26,52,11,57)) 
df2 <- data.frame(v3 = c(1,2,3,0,4,5,6,7)) 
df2$newCol = 0 

Je veux faire après le code de pseudo sans utiliser la fonction ou tout boucles (la fonction de bibliothèque peut être utilisée). Parce que l'ensemble de données est très long (50k lignes) et le traitement des codes communs prend beaucoup de temps).

for i to length(df2$v3) 
    for j to length(df1$v1) 
     if (df2$v3[i] == df1$v1[j]) 
      df2$newCol[i] = df2$newCol[i] + df$v2[j] 
+0

Qu'est-ce que 'newcol' ... si elle est une nouvelle colonne, comment voulez-vous ... – Suren

+0

initialisez @Headpoint toutes les lignes 0 –

Répondre

1
df1 <- data.frame(v1 = c(1,1,1,4,5,5,4,1,2,3,5,6,2,1,5), 
        v2 = c(11,13,3,42,15,25,44,13,21,73,65,26,52,11,57)) 
df2 <- data.frame(v3 = c(1,2,3,0,4,5,6,7)) 

Votre code

df2$newCol=0 
for (i in 1 :length(df2$v3)){ 
    for (j in 1: length(df1$v1)){ 
    if (df2$v3[i] == df1$v1[j]){ 
     df2$newCol[i] = df2$newCol[i] + df1$v2[j] 

     } 

    } 
} 

Ma solution

df1_ori=df1# keep it 
df1$sum=ave(df1$v2,df1$v1,FUN=sum) 
df1=df1[!duplicated(df1$v1),] 
df2$Newcol=df1$sum[match(df2$v3,df1$v1)] 
df2[is.na(df2)]=0 



df2 
    v3 newCol Newcol 
1 1  51  51 
2 2  73  73 
3 3  73  73 
4 0  0  0 
5 4  86  86 
6 5 162 162 
7 6  26  26 
8 7  0  0 
+0

Ce code a changé mes données et j'ai perdu les lignes répétées. Je ne veux pas changer mes données. –

+0

@JonahThunderbolt ajouté une voie garder l'original – Wen

0

Je ne sais pas comment cette efficacité est ou si elle correspond à votre cas d'utilisation, mais une autre façon cela pourrait être fait en utilisant dplyr est de totaliser les valeurs d'abord en df1 pour chaque valeur unique en v1 le n joindre le résultat à df2. Toutes les valeurs de df2$v3 qui n'ont pas une valeur correspondante dans df1$v1 sont mis à zéro:

library(dplyr) 
df1 %>% group_by(v1) %>% 
    summarise(newCol = sum(v2)) %>% 
    right_join(df2, by = c("v1" = "v3")) %>% 
    rename(v3 = v1) %>% 
    mutate(newCol = coalesce(newCol, 0)) 

#> # A tibble: 8 x 2 
#>  v3 newCol 
#> <dbl> <dbl> 
#> 1  1  51 
#> 2  2  73 
#> 3  3  73 
#> 4  0  0 
#> 5  4  86 
#> 6  5 162 
#> 7  6  26 
#> 8  7  0