我有以下数据框:
> 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的值的总和,并尝试将原始df$value
除以具有匹配dfa$value
的汇总总数n
:
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]]
答案 0 :(得分:4)
我认为以下方法有效,使用包data.table
。
df <- data.table(df)
df[,value2 := value/sum(value),by=n]
答案 1 :(得分: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))
答案 2 :(得分:1)
您拥有的代码存在以下问题:
df$value <- df$value / dfa[dfa$n==df$n,][[1]]
行dfa$n==df$n
返回一个长度为max(length(df),length(dfa)
的逻辑向量,告诉您n
匹配的每个索引。我认为您不能使用它来匹配dfa$n
到df$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