Мы можем создать фреймы данных по каждой паре строк, а затем суммировать эти пары, суммируя по # столбцам и помещая названия продуктов в список. Здесь я использую пакеты dplyr
и purrr
, но это можно сделать и в base
аналогичным образом.
library(dplyr)
library(purrr)
id.row <- combn(nrow(df1),2) ## to get a matrix with ids of each pair of rows
## first I create a list of dataframes with pair of rows
map(1:ncol(id.row), function(i)
rbind(df1[id.row[1,i], ], df1[id.row[2,i], ])) %>%
## then I summarize them based on column class (converting factors to character first)
map(. %>%
mutate_if(is.factor, as.character) %>%
summarise_each(funs(if(is.numeric(.)) sum(., na.rm = TRUE) else list(.))))
#> [[1]]
#> product per1 per2 per3
#> 1 A, B 33 34 51
#>
#> [[2]]
#> product per1 per2 per3
#> 1 A, C 36 115 111
#>
#> [[3]]
#> product per1 per2 per3
#> 1 B, C 49 109 102
Если у вас есть специальный c список набора строк, которые вы хотите суммировать попарно, вы можете сделать следующее:
## specific pair of rows as you need
id.row <- cbind(c("A", "B"), c("B", "C"))
## first I create a list of dataframes with pair of rows
map(1:ncol(id.row), function(i)
rbind(df1[df1$product==id.row[1,i],], df1[df1$product==id.row[2,i],])) %>%
## then I summarize them based on column class (converting factors to character first)
map(. %>%
mutate_if(is.factor, as.character) %>%
summarise_each(funs(if(is.numeric(.)) sum(., na.rm = TRUE) else list(.))))
#> [[1]]
#> product per1 per2 per3
#> 1 A, B 33 34 51
#>
#> [[2]]
#> product per1 per2 per3
#> 1 B, C 49 109 102
Data :
df1 <- read.table(text="product per1 per2 per3
A 10 20 30
B 23 14 21
C 26 95 81", header=T)