-1

次のデータがあります。

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 みんな!お願いします...私は2つの解決策を行いました。最初は非常に見苦しく(ここに置く意味はありませんが、リストを作成し、リストの各要素の計算でループすることに基づいています)、2番目は次のとおりです。

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])

私はただ素敵でクールなものを探しています。

4

3 に答える 3

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
于 2014-06-11T11:04:50.860 に答える
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
于 2014-06-11T11:14:09.743 に答える