【问题标题】:how can I normalize data frame values by the sum (get percents)如何通过总和来标准化数据框值(获取百分比)
【发布时间】:2012-08-22 03:34:13
【问题描述】:

我有以下数据框:

> 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$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]]

【问题讨论】:

    标签: r dataframe aggregate data.table


    【解决方案1】:

    我会使用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】:

      你的代码的问题是这一行:

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

      dfa$n==df$n 行返回一个长度为max(length(df),length(dfa) 的逻辑向量,它会告诉您每个索引是否与n 匹配。我不认为你可以用它来匹配 dfa$ndf$n

      使用base函数,可以使用aggregatemerge

      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
      

      【讨论】:

      • 如果数据很大,合并步骤会很慢。您首先提供的data.table 解决方案更可取。为了回答 OP 的问题,您始终可以使用 as.data.frame 强制“仅”使用 data.frameggplot
      • 了解效率。我想这个答案是自我放纵,尽管看到多种做事方式可能还不错。看起来 OP 的数据集是 52 行,所以速度似乎不是一个大问题。
      • fwiw, plyr 对于较小的数据量也是一个优雅的解决方案。 library(plyr); ddply(df, .(n), transform, value2 = value / sum(value))
      • 不幸的是,我对plyr 知之甚少,但它看起来确实很优雅。我得调查一下。
      【解决方案3】:

      我认为以下工作,使用包data.table

      df <- data.table(df)
      df[,value2 := value/sum(value),by=n]
      

      【讨论】:

      • 真的有必要转表吗?或者我可以将它作为数据框取回吗?我需要它来使用 ggplot2 进行绘图 ...
      • data.table 扩展data.frame,因此您可以对数据框执行的任何操作都可以对数据表执行。执行此操作后,您甚至可以将其转换回数据框。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-28
      • 1970-01-01
      • 2020-01-22
      相关资源
      最近更新 更多