2

こんにちは、次の data.frame (追加) があります。正規化されたカウントを含む列を追加したいと思いますN = N/sum(N)。日付列のない以前の data.frame があり、これを使用してこれを行うことができました

oo[, N.norm := N/sum(N), by=Operator]

by関数に日付を追加しようとしました

oo[, N.norm := N/sum(N), by=Operator,Date]

エラーメッセージが表示されます

Error in `[.data.frame`(oo, , `:=`(N.norm, N/sum(N)), by = Operator, Date) : 
  unused argument(s) (by = Operator)

たとえば、月「2013 年 1 月」の演算子「A」の場合、Nそれぞれのカウント数ROI_SCore= c("Good","OK","Poor","Crap") があります。その組み合わせ(Aと2013年1月)のNを合計し、カウントNsum(N)

別の注意として、Rでdata.framesを操作するためのまともな紹介を誰かに提供してもらえますか

structure(list(Operator = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 
4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 5L, 5L, 5L, 5L, 5L, 5L, 
5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L), .Label = c("A", 
"D", "J", "L", "M"), class = "factor"), ROI_Score = structure(c(1L, 
1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 4L, 4L, 
4L, 4L, 4L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 
3L, 3L, 4L, 4L, 4L, 4L, 4L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 
2L, 3L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 4L, 1L, 1L, 1L, 1L, 1L, 
2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 4L, 1L, 
1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 4L, 4L, 
4L, 4L, 4L), .Label = c("Crap", "Good", "OK", "Poor"), class = "factor"), 
    Date = c("Apr 2013", "Feb 2013", "Jan 2013", "Mar 2013", 
    "May 2013", "Apr 2013", "Feb 2013", "Jan 2013", "Mar 2013", 
    "May 2013", "Apr 2013", "Feb 2013", "Jan 2013", "Mar 2013", 
    "May 2013", "Apr 2013", "Feb 2013", "Jan 2013", "Mar 2013", 
    "May 2013", "Apr 2013", "Feb 2013", "Jan 2013", "Mar 2013", 
    "May 2013", "Apr 2013", "Feb 2013", "Jan 2013", "Mar 2013", 
    "May 2013", "Apr 2013", "Feb 2013", "Jan 2013", "Mar 2013", 
    "May 2013", "Apr 2013", "Feb 2013", "Jan 2013", "Mar 2013", 
    "May 2013", "Apr 2013", "Feb 2013", "Jan 2013", "Mar 2013", 
    "May 2013", "Apr 2013", "Feb 2013", "Jan 2013", "Mar 2013", 
    "May 2013", "Apr 2013", "Feb 2013", "Jan 2013", "Mar 2013", 
    "May 2013", "Apr 2013", "Feb 2013", "Jan 2013", "Mar 2013", 
    "May 2013", "Apr 2013", "Feb 2013", "Jan 2013", "Mar 2013", 
    "May 2013", "Apr 2013", "Feb 2013", "Jan 2013", "Mar 2013", 
    "May 2013", "Apr 2013", "Feb 2013", "Jan 2013", "Mar 2013", 
    "May 2013", "Apr 2013", "Feb 2013", "Jan 2013", "Mar 2013", 
    "May 2013", "Apr 2013", "Feb 2013", "Jan 2013", "Mar 2013", 
    "May 2013", "Apr 2013", "Feb 2013", "Jan 2013", "Mar 2013", 
    "May 2013", "Apr 2013", "Feb 2013", "Jan 2013", "Mar 2013", 
    "May 2013", "Apr 2013", "Feb 2013", "Jan 2013", "Mar 2013", 
    "May 2013"), N = c(0, 0, 0, 0, 0, 1, 2, 15, 1, 5, 3, 2, 3, 
    1, 0, 3, 0, 5, 5, 1, 0, 0, 0, 1, 0, 14, 17, 16, 8, 7, 5, 
    10, 6, 1, 5, 24, 27, 31, 16, 15, 0, 0, 0, 0, 0, 26, 24, 20, 
    11, 18, 3, 4, 17, 3, 2, 20, 36, 12, 21, 9, 0, 0, 0, 0, 0, 
    3, 12, 5, 12, 4, 0, 0, 3, 4, 0, 29, 37, 41, 25, 10, 0, 0, 
    0, 0, 0, 9, 9, 15, 17, 3, 6, 4, 5, 4, 1, 14, 13, 9, 15, 9
    )), .Names = c("Operator", "ROI_Score", "Date", "N"), row.names = c(NA, 
100L), class = "data.frame")

データが data.frame 形式か data.table 形式かは不明です。これが、Arun によって提供されたソリューションから適応された私のコードです (正規化された棒グラフと円グラフを作成するためのデータ フレームの形状変更/再成形) 。

df <- data.frame(read.csv("/misc/jaguar_data/report/system/db_fs/roi_scores.csv"))
#Get date into nice structure for faceting
df$Date = strftime(strptime(df$Date,f="%d/%m/%Y"), "%b %Y")
dt <- data.table(df)
ops <- as.character(unique(dt$Operator))
scr <- as.character(unique(dt$ROI_Score))
dts <- unique(dt$Date)

oo <- setkey(dt[, .N, by="Operator,ROI_Score,Date"], Operator,
ROI_Score,Date)[CJ(ops, scr,dts)][is.na(N), N:= 0L]

oo[, N.norm := N/sum(N), by=Operator]
4

2 に答える 2

4

あなたのコードは (ほぼ) 完璧でした。2つの小さな問題。

1:data.table構文を使用しているため、 ではなく にooするdata.frame必要がありdata.tableます。単純に使用します:

 library(data.table)  
 oo <- data.table(oo)

2:by複数の列で使用する場合は、列を 1 つのコンマ区切り文字列でlist(..)囲むか、1 つのコンマ区切り文字列として囲むようにしてください。例

 oo[, N.norm := N/sum(N), by=list(Operator,Date)]

 # - or - #
 oo[, N.norm := N/sum(N), by="Operator,Date"]

編集:各グループの合計で割ることを望んでいる場合、コードは上記のようになりますOperator。代わりに、データ全体Dateの合計で割りたい場合は、次を使用します

 oo[, N.norm := N/sum(DT$N), by=list(Operator,Date)]

これら2つのことを修正し、他のすべてをそのまま使用します。

     Operator ROI_Score     Date  N    N.norm
  1:        A      Crap Apr 2013  0 0.0000000
  2:        A      Crap Feb 2013  0 0.0000000
  3:        A      Crap Jan 2013  0 0.0000000
  4:        A      Crap Mar 2013  0 0.0000000
  5:        A      Crap May 2013  0 0.0000000
 ---                                         
 96:        M      Poor Apr 2013 14 0.4827586
 97:        M      Poor Feb 2013 13 0.5000000
 98:        M      Poor Jan 2013  9 0.3103448
 99:        M      Poor Mar 2013 15 0.4166667
100:        M      Poor May 2013  9 0.6923077

編集2:

ただのメモ。一般に、[括弧内で式]、特に参照による代入演算子を使用している:=場合、オブジェクトはdata.table.

次のようなエラーが表示された場合

 Error in `[.data.frame`( _<your object name>_, ...

これは、(a) オブジェクトが data.table ではないか、(b) data.table をロードするのを忘れたことが原因である可能性がありますpackage

于 2013-05-20T12:32:06.230 に答える
1

このデータセットでやりたいことはできないと思います。理由は次のとおりです。

install.packages("plyr")
library("plyr")
str(tmp) # this is your data
count(tmp, vars = c("Operator", "ROI_Score"))

これを与える:

   Operator ROI_Score freq
1         A      Crap    5
2         A      Good    5
3         A        OK    5
4         A      Poor    5
5         D      Crap    5
6         D      Good    5
7         D        OK    5
8         D      Poor    5
9         J      Crap    5
10        J      Good    5
11        J        OK    5
12        J      Poor    5
13        L      Crap    5
14        L      Good    5
15        L        OK    5
16        L      Poor    5
17        M      Crap    5
18        M      Good    5
19        M        OK    5
20        M      Poor    5

また、含めるDateとすべての値が一意になるため、すべてのカウントが 1 になります。

を使用するdata.frameと、原則として、次の方法で取得できます。

ans <- aggregate(N ~ Operator + ROI_Score + Date, data = tmp, FUN = sum)

次に、関数を変更して、必要なことを正確に実行します (エントリの数を 100 で割りますか?)。しかし、これがあなたの望むものかどうかはわかりません。

編集

オペレーターと日付ごとに各評価カテゴリのパーセンテージが必要なため、最初にサブセット化してから集計します。

tmp2 <- subset(tmp, Operator == "A")
ans2 <- aggregate(N ~ ROI_Score, data = tmp2, FUN = sum)
ans2$N.norm <- ans2$N/sum(ans2$N)

与えます:

  ROI_Score  N    N.norm
1      Crap  0 0.0000000
2      Good 24 0.5106383
3        OK  9 0.1914894
4      Poor 14 0.2978723
于 2013-05-20T11:15:30.937 に答える