5

次のデータフレームがあります。

> str(df)
 'data.frame':  52 obs. of  3 variables:
  $ n    : int  10 20 64 108 128 144 256 320 404 512 ...
  $ step : Factor w/ 4 levels "Step1","Step2",..: 1 1 1 1 1 1 1 1 1 1 ...
  $ value: num  0.00178 0.000956 0.001613 0.001998 0.002975 ...

df$valueここで、パーセンテージを取得できるように、同じnに属する値の合計で正規化/除算したいと思います。これは機能しませんが、私が達成したいことを示しています。ここでは、同じ n に属する値の合計を dfa に事前計算し、一致するdf$value集計された合計で元を除算しようとします。dfa$valuen

dfa <- aggregate(x=df$value, by=list(df$n), FUN=sum)
names(dfa)[names(dfa)=="Group.1"] <- "n"           
names(dfa)[names(dfa)=="x"] <- "value"
df$value <- df$value / dfa[dfa$n==df$n,][[1]]
4

3 に答える 3

5

package を使用して、次のように動作すると思いますdata.table

df <- data.table(df)
df[,value2 := value/sum(value),by=n]
于 2012-08-27T16:12:09.947 に答える
4

私は使用しますave

set.seed(123)
df <- data.frame(n=rep(c(2,3,6,8), each=5), value = sample(5:60, 20))
df$value_2 <- ave(df$value, list(df$n), FUN=function(L) L/sum(L))
于 2012-08-27T16:57:11.440 に答える
1

あなたが持っているコードの問題は、この行です:

df$value <- df$value / dfa[dfa$n==df$n,][[1]]

行は、各インデックスが一致するかどうかを示すdfa$n==df$n長さの論理ベクトルを返します。に一致させるためにそれを使用できるとは思いません。max(length(df),length(dfa)ndfa$ndf$n

base関数を使用すると、 および を使用できaggregateますmerge

dfa <- aggregate(x=df$value, by=list(df$n), FUN=sum)
names(dfa) <- c("n","sum.value") 
df2 <- merge(df,dfa,by="n",all = TRUE)
df2$value2 <- df2$value/df2$sum.value
于 2012-08-27T16:29:57.353 に答える