Результат по условию в кадре данных в R - PullRequest
5 голосов
/ 15 октября 2019

Рассмотрим следующий фрейм данных:

df <- data.frame(row_id = c("r1","r2","r3","r4","r1","r2","r3","r4"),
                 v1 = c(3,2,5,2,5,2,6,4),
                 v2 = c(4,3,5,3,7,4,6,7))

Я хочу взять сумму-произведение по "row_id". То есть для строк с row_id: «r1» я хочу сделать следующий расчет: (3 * 4) + (5 * 7). И так далее.

Таким образом, у меня наконец будет следующая матрица:

df1 <- data.frame(row_id = c("r1","r2","r3","r4"),
                 v1 = c(47,14,61,34))

Любая помощь будет по достоинству оценена.

Спасибо.

Ответы [ 5 ]

6 голосов
/ 15 октября 2019

Аналогично, но немного короче:

dplyr::count(df, row_id, wt = v1*v2)
4 голосов
/ 15 октября 2019

используя базу R, мы также можем transform затем aggregate

 aggregate(tot~row_id,transform(df,tot = v1*v2),sum)

  row_id tot
1     r1  47
2     r2  14
3     r3  61
4     r4  34

или вы также можете сделать:

c(by(df[-1],df[1],do.call,what = "%*%"))
r1 r2 r3 r4 
47 14 61 34 
3 голосов
/ 15 октября 2019

Использование base R с split и %*%

sapply(split(df[-1], df$row_id), function(x) x[,1] %*% x[,2])
# r1 r2 r3 r4 
#47 14 61 34 

Или другой вариант rowsum из base R

rowsum(with(df, v1 * v2), group = df$row_id)
#    [,1]
#r1   47
#r2   14
#r3   61
#r4   34

или используя data.table

library(data.table)
setDT(df)[, do.call(`%*%`, .SD), row_id]
#   row_id V1
#1:     r1 47
#2:     r2 14
#3:     r3 61
#4:     r4 34
3 голосов
/ 15 октября 2019
library(dplyr)
df %>%
    mutate(p = Reduce("*", .[-1])) %>%
    group_by(row_id) %>%
    summarise(v = sum(p))

ИЛИ

tapply(Reduce("*", df[-1]), df$row_id, sum)
#r1 r2 r3 r4 
#47 14 61 34 
1 голос
/ 16 октября 2019

с использованием dplyr:

library(dplyr)
df %>% group_by(row_id) %>% summarize(sum(v1*v2))

# which gives:
# A tibble: 4 x 2
  row_id `sum(v1 * v2)`
  <fct>           <dbl>
1 r1                 47
2 r2                 14
3 r3                 61
4 r4                 34
...