使用类似累积总和或R中每个列表元素的函数

时间:2014-06-11 10:38:52

标签: r data.table cumsum

我有以下数据:

col1 = c(rep("a",4),rep("b",8),rep("c",6), rep("d",2))
col2 = sample(-100:250, 20)
col3 = cumsum(col2)
data = data.table(col1, col2, col3)


和data.table:

    col1 col2 col3
 1:    a   56   56
 2:    a   90  146
 3:    a   85  231
 4:    a  214  445
 5:    b  -39  406
 6:    b  116  522
 7:    b   42  564
 8:    b  131  695
 9:    b  161  856
10:    b   54  910
11:    b   15  925
12:    b  229 1154
13:    c  166 1320
14:    c  224 1544
15:    c  -53 1491
16:    c   87 1578
17:    c -100 1478
18:    c  -11 1467
19:    d   28 1495
20:    d  143 1638

如你所见,它只是按照col1分组。我想根据col1中的组进行一些计算(如cumsum,count if等)。

最后我想:

col1 colsum countif>0  countif<0
a    445    4          0
b    709    7          1
c    313    3          3
d    171    2          0


@commentators 伙计们!请...我做了两个解决方案,第一个非常难看(没有意义把它放在这里,但是基于列表和循环计算列表的每个元素),其次是:

a1 = aggregate (col2 ~ col1, sum, date = date)
a2 = aggregate (col2> 0 ~ col1, sum, date = date)
a3 = aggregate (col2 <0 ~ col1, sum, date = date)
cbind (a1, a2 counfif_1 = [2], counfif_2 = a3 [2])

我正在寻找一些美好而酷的东西。

3 个答案:

答案 0 :(得分:1)

您可以使用dplyr来实现类似的目标

library(dplyr)

set.seed(1)
col1 <- c(rep("a", 4), rep("b", 8), rep("c", 6), rep("d",2))
col2 <- sample(-100:250, 20)
data <- tbl_df(data.frame(col1, col2))
str(data)
## Classes ‘tbl_df’, ‘tbl’ and 'data.frame':    20 obs. of  3 variables:
##  $ col1: Factor w/ 4 levels "a","b","c","d": 1 1 1 1 2 2 2 2 2 2 ...
##  $ col2: int  -7 30 99 216 -31 210 225 127 115 -79 ...


data %>%
    group_by(col1) %>%
        summarise(colsum = sum(col2),
                  countifpos = sum(col2 > 0),
                  countifneg = sum(col2 < 0))
## Source: local data frame [4 x 4]

##   col1 colsum countifpos countifneg
## 1    a    338          3          1
## 2    b    497          4          4
## 3    c    758          6          0
## 4    d    184          2          0

答案 1 :(得分:1)

data[, list(colsum = sum(col2),
            `countif>0` = sum(col2 > 0),
            `countif<0` = sum(col2 < 0)), by = col1]

##     col1 colsum countif>0 countif<0
## 1:    a    445         4          0
## 2:    b    709         7          1
## 3:    c    313         3          3
## 4:    d    171         2          0

答案 2 :(得分:0)

您可以使用tapply按组获取摘要 例如:

这是您定义计算指标的地方

metrics =  function(x) { c(sum(x), length(x[x<0]) , length(x[x>0]) )}

您使用metrics功能通过tapply函数按组计算指标

tapply (data$col2, data$col1, metrics)
$a
[1] 241 -50 291

$b
[1] 526 -86 612

$c
[1] 483 -94 577

$d
[1] -88 -88   0

然后,您可以将此输出转换为请求的数据框