2017-10-21 4 views
0

のいずれかのループとしてマッチした行に追加し、次のように私のデータセットのサンプルは次のとおりです。特定の行を合計し、機能を使用してwtithout新しい属性または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 

私は関数またはいずれかを使用せずに、次の擬似コードをしたいですループ(ライブラリ関数を使用することができます)。データセットが非常に長く(50k行)、共通コードの処理に時間がかかるためです)。

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

newcol' 'は何ですか...それは新しい列、あなたはどのように初期化しない... – Suren

+0

だ場合:df1$v1で一致する値がゼロに設定されている必要はありませんdf2$v3の任意の値@Headpointすべての行0は –

答えて

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)) 

あなたのコード

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] 

     } 

    } 
} 

私のソリューション

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

このコードは私のデータフレームを変更し、私は繰り返し行を失った。私は自分のデータフレームを変更したくない。 –

+0

@JonahThunderboltが元のまま1車線を追加 – Wen

0

私はこれがどのように効率的にわからないか、それはあなたのユースケースに合うならば、これは可能性が別の方法dplyrを使用して行われるのは、df1の各値を最初に合計することです。v1 n結果をdf2に結合します。

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 
関連する問題