Получить сумму за пару строк - PullRequest
3 голосов
/ 04 августа 2020

У меня есть следующий фрейм данных, импортированный в R:

product per1  per2  per3
A       10    20    30
B       23    14    21
C       26    95    81

Рассмотрим A: C как продукты, перечисленные в строках один за другим, и соответствующие им значения продаж через per_1: per_3, которые указаны в столбцах.

Количество продуктов довольно велико, поэтому я не могу перечислить все продукты Мое требование здесь - добавить продажи для комбинации продуктов.

Например,

A      10    20   30
B      23    14   21

Сумма должна быть

myresult<- A+B
myresult
33 34 51

Сумма должна быть 30 34 80, и ее нужно скопировать в другой вектор.

Количество произведений настолько велико, что я не мог транспонировать их и используйте для расчета. Предположим, что комбинация добавляемых продуктов также высока и случайна.

Вот мои данные:

structure(list(product = structure(1:3, .Label = c("A", "B", "C"), class = "factor"), 
               per1 = c(10, 20, 30), 
               per2 = c(23, 14, 21), 
               per3 = c(26, 95, 81)), 
          .Names = c("product", "per1", "per2", "per3"), 
          row.names = c(NA, -3L), class = "data.frame")

Ответы [ 4 ]

2 голосов
/ 05 августа 2020

Мы можем создать фреймы данных по каждой паре строк, а затем суммировать эти пары, суммируя по # столбцам и помещая названия продуктов в список. Здесь я использую пакеты 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)
1 голос
/ 09 августа 2020

Вот базовая опция R через combn

combn(seq(nrow(df1)),
  2,
  FUN = function(k) {
    cbind(
      product = toString(df1$product[k]),
      data.frame(as.list(colSums(df1[k, -1])))
    )
  },
  simplify = FALSE
)

, которая дает

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

Data

df1 <- structure(list(product = c("A", "B", "C"), per1 = c(10L, 23L, 
26L), per2 = c(20L, 14L, 95L), per3 = c(30L, 21L, 81L)), class = "data.frame", row.names = c(NA,
-3L))
0 голосов
/ 05 августа 2020
p2sum <- c("A", "B")
out <- colSums(df[df$product %in% p2sum, c("per1", "per2", "per3")])
out
per1 per2 per3 
  30   37  121

Данные:

df <- data.frame(
  product = structure(1:3, .Label = c("A", "B", "C"), class = "factor"), 
  per1 = c(10, 20, 30), 
  per2 = c(23, 14, 21), 
  per3 = c(26, 95, 81)
) 
0 голосов
/ 04 августа 2020

Будет ли это работать?

df["a", ] <- df["a", ] + df["c", ]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...