【问题标题】:R Using factor in a functionR在函数中使用因子
【发布时间】:2026-02-11 06:25:01
【问题描述】:

我在函数中使用因子时遇到了一些麻烦,或者只是在基本计算中使用它们。我有一个类似这样的数据框(但有多达 6000 个不同的因素)。

df<- data.frame( p <- runif(20)*100,
q = sample(1:100,20, replace = T),
tt = c("e","e","f","f","f","i","h","e","i","i","f","f","j","j","h","h","h","e","j","i"),
ta = c("a","a","a","b","b","b","a","a","c","c","a","b","a","a","c","c","b","a","c","b"))
colnames(df)<-c("p","q","ta","tt")

现在价格 = p 和数量 = q 是我的变量,而 tt 和 ta 是不同的因素。

现在,我首先想通过 tt 中的每个不同因素找到每单位 q 的平均价格

(p*q ) / sum(q) by tt

在这种情况下,这将给我一个包含 3 个不同总和的列表,分别为 a、b 和 c(我有 6000 个不同的因素,所以我需要聪明地做 :))。

我尝试使用 split 来制作列表,在这种情况下,我可以让每个单独的 tt 因子包含价格,另一个包含数量,但我似乎无法让它们例如做一个平均值。我也尝试过使用tapply,但我还是看不到如何将因素纳入其中?

编辑:我可以看到我需要清除:

我需要找到 3 个总和,即公关的平均价格。 q 给定每个因素,所以在这个简化的情况下,它将是:

a: p*q 之和 (Row (1,2,3, 7, 11, 13,14,18) / sum (q for row (1,2,3, 7, 11, 13, 14,18)

所以结果应该是 a、b 和 c 的平均价格,也就是 3 个值。

【问题讨论】:

    标签: r


    【解决方案1】:

    我会使用plyr 来执行此操作:

    library(plyr)
    ddply(df, .(tt), mutate, new_col = (p*q) / sum(q))
              p  q ta tt     new_col
    1  73.92499 70  e  a 11.29857879
    2  58.49011 60  e  a  7.66245932
    3  17.23246 27  f  a  1.01588711
    4  64.74637 42  h  a  5.93743967
    5  55.89372 45  e  a  5.49174103
    6  25.87318 83  f  a  4.68880732
    7  12.35469 23  j  a  0.62043207
    8   1.19060 83  j  a  0.21576367
    9  84.18467 25  e  a  4.59523322
    10 73.59459 66  f  b 10.07726727
    11 26.12099 99  f  b  5.36509998
    12 25.63809 80  i  b  4.25528535
    13 54.74334 90  f  b 10.22178577
    14 69.45430 50  h  b  7.20480246
    15 52.71006 97  i  b 10.60762667
    16 17.78591 54  i  c  5.16365066
    17  0.15036 41  i  c  0.03314388
    18 85.57796 30  h  c 13.80289670
    19 54.38938 44  h  c 12.86630433
    20 44.50439 17  j  c  4.06760541
    

    plyr 确实以速度慢着称,data.table 提供类似的功能,但性能要高得多。

    【讨论】:

    • 我需要将 p*q 除以属于因子 a、b 和 c 的所有变量的总和,以此类推。所以在我的例子中,我正在寻找 3 个总和。我想我应该试着澄清一下。
    【解决方案2】:

    如果我正确理解您的问题,这应该是答案。试一试,我可以根据需要进行调整。

    myRes <- function(tt) {
    
      out <- NULL;
      qsum <- sum(as.numeric(df[,"q"]))
      psum <- sum(as.numeric(df[,"p"]))
      for (var in tt) {
        index <- which(df["tt"] == var)
    
        out <- c(out, ((qsum *psum) / sum(df[index,"q"])))
      }
      return (out)
    }
    
    threeValue <- myRes(levels(df[, "tt"]));
    

    【讨论】:

    • 你检查过这个解决方案吗?
    • 是的,我可能遗漏了一些东西,但是,我正在寻找 3 个值,而不是我从这个函数中得到的 20 个值。我已经更新了问题。
    • 我在最后一行得到一个错误,“[.data.frame(df, index, "q") 中的错误:找不到对象'index'"`
    • 我赶时间抱歉。现在应该没问题了!