2

私は、反人身売買組織に関する情報を含むデータセットを使用しています。組織は、組織名または組織のホームページのWebアドレスのいずれかによって識別されます。このデータフレームをケースバイケースで条件付きで折りたたんで、一意の識別子のセット(私のデータの場合は、組織の名前または組織のWebアドレス)を残したいと思います。各ケースについて、これらのケースの約1000以上の数値属性は、折りたたむ前に識別子が関連付けられていた行の最大値または最小値のいずれかです。これを例証するために、私は回したいと思います:

> df1
x      y     z
Item1  0     3
Item1  1     4
Item2  1     2
Item3  1     3
Item2  1     5
Item3  1     2
Item4  0     2

のようなものに

> df2
x     y      z
Item1  1     3
Item2  1     2
Item3  1     2
Item4  0     2

もちろん、この例では、Var2の最大値とVar3の最小値を維持し、一意のVar1値のみを保持したいと思います。

大規模なデータセットに対してこれを行うための体系的な方法を誰かが提案できますか?よろしくお願いします!

4

4 に答える 4

6

1 つのオプションは、plyrパッケージを使用することです。

library(plyr)
ddply(df, .(x), summarize, y=max(y), z=min(z))
      x y z
1 Item1 1 3
2 Item2 1 2
3 Item3 1 2
4 Item4 0 2

あるいは、ほぼ同じくらい単純なのが packagedata.tableです。データが非常に大きい場合、このオプションは大幅に高速になる可能性があります。

library(data.table)
data.table(df)[, list(y=max(y), z=min(z)), by=x]
       x y z
1: Item1 1 3
2: Item2 1 2
3: Item3 1 2
4: Item4 0 2
于 2013-01-04T05:19:13.967 に答える
3

おそらく Andrie を選ぶべきだと思います。なぜなら、彼は間違いなくよりクリーンで確かに高速な data.table アプローチを提供するからですが、カテゴリ内のさまざまな結果を処理するための「古典的な」アプローチは次を使用することlapply(split(...))です。

> do.call(rbind, lapply( split(df1, df1$x) , function (d) data.frame(x=d$x[1], 
                                                          mx.y=max(d$y), mn.z=min(d$z)
             ) ) )

          x mx.y mn.z
Item1 Item1    1    3
Item2 Item2    1    2
Item3 Item3    1    2
Item4 Item4    0    2
于 2013-01-04T06:11:17.603 に答える
2
library(plyr)
V1 <- sample(10, 100, replace=TRUE)
V2 <- sample(100, 100, replace=TRUE)
V3 <- sample(100, 100, replace=TRUE)

df <- data.frame(V1=V1, V2=V2, V3=V3)

ddply(df, "V1", function(x) c(max(x$V2), min(x$V3)))
于 2013-01-04T05:26:39.850 に答える
2

yとは行数を表し、それzによって本質的に正であるため、次の単純なアプローチを使用できます。

aggregate(cbind(y, -z) ~ x, df1, function(x) abs(max(x)))

      x y -z
1 Item1 1  3
2 Item2 1  2
3 Item3 1  2
4 Item4 0  2
于 2013-01-04T06:31:27.930 に答える