1

以下のようなサンプルデータ(Zと呼ぶ)にddplyを使用しようとしています:

id    y
1001  10
1001  11
1200  12
2001  10
2030  12
2100  32
3100  10
3190  13
4100  45
5100  67
5670  56
...
10001  54
10345  45
11234  32
and so on

私の目的は、1(ie1001,1200、..)、2(2100)、3(3100,3190)、4、... 10,11、...65で始まるidのyの合計を見つけることです。 。たとえば、1で始まるidの場合、合計は10 + 11 + 12 = 33であり、2で始まるidの場合、合計は32です。

次のようなapply関数を使用したかったのです。

>s <- split(z,z$id)
>lapply(s, function(x) colSums(x[, c("y")]))

ただし、これにより、探していたIDではなく、一意のIDごとに合計が得られます。この点に関する提案をいただければ幸いです。

4

3 に答える 3

5

これは、整数除算を実行するためdata.tableに使用するソリューションです%/%(数千を返します)

library(data.table)
DT <- data.table(z)

x <- DT[,list(sum_y = sum(y)), by = list(id = id %/% 1000)]
x
   id sum_y
1:  1    33
2:  2    54
3:  3    23
4:  4    45
5:  5   123
6: 10    99

あなたは同様のことをすることができますddply

ddply(z, .(id = id %/% 1000 ), summarize, sum_y = sum(y))
  id sum_y
1  1    33
2  2    54
3  3    23
4  4    45
5  5   123
6 10    99
于 2012-11-12T05:16:58.427 に答える
3

これはあなたに意図された答えを与えますか?

z <- read.table(textConnection("id y
1001 10
1001 11
1200 12
2001 10
2030 12
2100 32
3100 10
3190 13
4100 45
5100 67
5670 56
10001 54
10345 45"),header=TRUE)

result <- tapply(
                 z$y,
                 as.numeric(substr(z$id,1,nchar(z$id)-3)),
                 sum
                )

result
  1   2   3   4   5  10 
 33  54  23  45 123  99 

@mnelの行を上から盗むには、これを次のように簡略化できます。

result <- tapply(
                 z$y,
                 z$id %/% 1000,
                 sum
                )
于 2012-11-12T05:07:44.380 に答える
3

lapplythelatemailは有効なアプローチを提供しますが、問題は実際には(コードはほぼ正しい)理解ではなく、グループ化について考えることにあることを指摘したいと思います。thelatemailは彼のソリューションでこれを行い、それが鍵となります。私はあなたのアプローチをあなたに示し、それから私が実際にこれにどのようにアプローチし、そして私がそれaveを使うことができないという理由だけでそれを使うのかをお見せします:)

データの読み込み

z <- read.table(textConnection("id y #stole this from the latemail
1001 10
1001 11
1200 12
2001 10
2030 12
2100 32
3100 10
3190 13
4100 45
5100 67
5670 56
10001 54
10345 45"),header=TRUE)

コードを調整しました

s <- split(z, substring(as.character(z$id), 1, nchar(as.character(z$id)) - 3))
lapply(s, function(x) sum(x[, "y"]))

私が取る可能性のあるアプローチ。新しい因子ID変数を追加します

z$IDgroup <- substring(as.character(z$id), 1, nchar(as.character(z$id)) - 3)
aggregate(y ~ IDgroup, z, sum)
#similar approach but adds the solution back as a new column
z$group.sum <- ave(z$y, z$IDgroup, FUN=sum)
z
于 2012-11-12T05:24:01.473 に答える