簡體   English   中英

R函數中的使用因數

[英]R Using factor in a function

我在函數中使用因子或僅在基本計算中使用它們時遇到一些麻煩。 我有一個類似這樣的數據框(但是有多達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

在這種情況下,這將通過a,b和c給出3個不同總和的列表(我有6000個不同的因數,所以我需要做得很聰明:))。

我已經嘗試使用split來創建列表,在這種情況下,我可以讓每個tt因素包含價格,而另一個可以包含數量,但是我似乎無法例如使它們成為平均值。 我也嘗試過使用tapply,但是再次看不到如何將因素納入其中?

編輯:我可以看到我需要澄清:

我需要找到3個總和,平均價格pr。 給定每個因子,因此在這種簡化情況下為:

a:(行(1,2,3,7,11,13,14,18)的p * q的總和/(行Row(1,2,3,7,11,13,14,18的q的q) )

因此,結果應該是a,b和c的平均價格,僅為3個值。

我會用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.tabledata.table提供了類似的功能,但是性能更高。

如果我完全理解您的問題,那應該是答案。 嘗試一下並做出回應,如有需要,我可以進行調整。

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"]));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM