总结特定的行并将其添加到匹配的行作为一个新的属性wtithout使用功能或R中的任何环

问题描述:

我的数据集示例如下:总结特定的行并将其添加到匹配的行作为一个新的属性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

@Headpoint中的所有第0行 –

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加了一条车道保留原文 – Wen

我不知道如何有效的,这是和它是否适合你的使用情况,而是另辟蹊径,这可能使用dplyr完成的是对v1中的每个唯一值df1中的值进行总计n将结果加入df2。这不df1$v1有一个匹配值的df2$v3的任何值设置为零:

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