1

私の質問のために、ダミーのデータ フレームを作成しました。

    set.seed(007)
 DF <- data.frame(a = rep(LETTERS[1:5], each=2), b = sample(40:49), c = sample(1:10))
 DF
   a  b  c
1  A 49  2
2  A 43  3
3  B 40  7
4  B 47  1
5  C 41  9
6  C 48  8
7  D 45  6
8  D 42  5
9  E 46 10
10 E 44  4

aたとえば、「A」の場合、次の値が計算されるように、列で集計関数を使用するにはどうすればよいですか: 49-43 / 2+3?

私は次のように始めました:

aggregate(DF, by=list(DF$a), FUN=function(x) {

  ...

})

私が抱えている問題は、4つの異なるセル49、43、2、および3にアクセスする方法x[[1]][1]がわからないことです。同様のものを試しましたが、機能しません。

4

5 に答える 5

4

内部aggregateでは、関数FUNはデータの各列に個別に適用されます。ここでは、入力として 2 つの列を受け取る関数を使用したいので、アプリオリにそのために使用することはできませんaggregate

代わりに、パッケージddplyから使用できます。plyr

ddply(DF, "a", summarize, res = (b[1] - b[2]) / sum(c))
#   a        res
# 1 A  1.2000000
# 2 B -0.8750000
# 3 C -0.4117647
# 4 D  0.2727273
# 5 E  0.1428571
于 2012-09-12T10:53:56.910 に答える
2

使用data.tableはより速く、より簡単になる可能性があります。

library(data.table)
DT <- data.table(DF)
DT[, (-1*diff(b))/sum(c), by=a]
  a         V1
1: A  1.2000000
2: B -0.8750000
3: C -0.4117647
4: D  0.2727273
5: E  0.1428571

骨材を使用していますが、あまり良くありません。:(を使用してそれを行うためのより良い方法はありませんでしたaggregateが、ここに試みがあります。

B <- aggregate(DF$b, by=list(DF$a), diff)
C <- aggregate(DF$c, by=list(DF$a), sum)
data.frame(a=B[,1], Result=(-1*B[,2])/C[,2])
  a     Result
1 A  1.2000000
2 B -0.8750000
3 C -0.4117647
4 D  0.2727273
5 E  0.1428571
于 2012-09-12T12:46:49.970 に答える
2

集計すると、FUN引数は何でもかまいません。渡される値は、a vector(x が 1 列の場合) または little data.frameor matrix(x が複数の場合) になることに注意してください。ただし、aggregate複数列の引数の列にはアクセスできません。例えば。

aggregate( . ~ a, data = DF, FUN = function(x) diff(x[,1]) / sum(x[,2]) )

私が使用したにもかかわらず、エラーで失敗します.(他の場所で使用していないDFのすべての列を取得します)。そこで何aggregateをしようとしているのかを見るには、以下を見てください。

aggregate( . ~ a, data = DF, FUN = sum )

2 つの列 b と c は集約されましたが、最初の試みから、各列に個別にアクセスするようなことはできないことがわかりました。したがって、厳密に集約に固執するには、2 つのパスと 3 行のコードが必要です。

diffb <- aggregate( b ~ a, data = DF, FUN = diff )
Y <- aggregate( c ~ a, data = DF, FUN = sum )
Y$c <- diffb$b / Y$c

Y には、必要な結果が含まれています。

by関数はより単純で、インデックスを使用しaggregateてオリジナルを分割し、関数を適用するだけです。 data.frameFUN

l <- by( data = DF, INDICES = DF$a, FUN = function(x) diff(x$b)/sum(x$c), simplify = FALSE )
unlist(l)

data.frame本当に必要な場合は、結果を に戻すために少し手を加える必要があります。

data.frame(a = names(l), x = unlist(l))
于 2012-09-12T12:37:36.990 に答える
1

data.table解決策 - 時間と記憶の効率化のため。

library(data.table)
DT <- as.data.table(DF)

DT[, list(calc = diff(b) / sum(c)), by = a]
于 2012-09-12T12:49:48.760 に答える
0

基本by()関数を使用できます。

listOfRows <- 
by(data=DF,
   INDICES=DF$a,
   FUN=function(x){data.frame(a=x$a[1],res=(x$b[1] - x$b[2])/(x$c[1] + x$c[2]))})

newDF <- do.call(rbind,listOfRows)
于 2012-09-12T11:00:25.770 に答える