总结特定的行并将其添加到匹配的行作为一个新的属性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]
答
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
什么是'newcol' ...如果它是一个新的专栏,你怎么初始化... – Suren
@Headpoint中的所有第0行 –