2017-06-13 9 views
2

集計関数とパーセント関数を列に適用したい。集計(Calculating multiple aggregations with lapply(.SD, ...) in data.table R package)とパーセンテージ(How to obtain percentages per value for the keys in R using data.table?Use data.table to calculate the percentage of occurrence depending on the category in another column)について議論するスレッドが見つかりましたが、両方ではありません。data.tableを使用してパーセントとその他の関数を計算する

私はdata.tableに基づいています。 dplyrは実際のデータセットでは機能しません。ここで

は、サンプル・データを生成するコードです:

set.seed(10) 
    IData <- data.frame(let = sample(x = LETTERS, size = 10000, replace=TRUE), numbers1 = sample(x = c(1:20000),size = 10000), numbers2 = sample(x = c(1:20000),size = 10000)) 
    IData$let<-as.character(IData$let) 

    data.table::setDT(IData) 

ここで私はhead(output)を実行した場合の出力例(ヘッダ) dplyr

Output <- IData %>% 
    dplyr::group_by(let) %>% 
    dplyr::summarise(numbers1.mean = as.double(mean(numbers1)),numbers1.median = as.double(median(numbers1)),numbers2.mean=as.double(mean(numbers2)),sum.numbers1.n = sum(numbers1)) %>% 
    dplyr::ungroup() %>% 
    dplyr::mutate(perc.numbers1 = sum.numbers1.n/sum(sum.numbers1.n)) %>% 
    dplyr::select(numbers1.mean,numbers1.median,numbers2.mean,perc.numbers1) 

を使用して出力を生成するコードは私が、です次のようになります。

let numbers1.mean numbers1.median numbers2.mean perc.numbers1 
    <chr>   <dbl>   <dbl>   <dbl>   <dbl> 
    N  10320.951   10473.0  9374.435 0.03567927 
    H  9683.590   9256.5  9328.035 0.03648391 
    L  10223.322   10226.0  9806.210 0.04005400 
    S  9922.486   9618.0  10233.849 0.03678742 
    C  9592.620   9226.0  9791.221 0.03517997 
    F  10323.867   10382.0  10036.561 0.03962035 

は、ここで私が使用してみました何data.table(失敗した)私は2つの質問がある

IData[, as.list(unlist(lapply(.SD, function(x) list(mean=mean(x),median=median(x),sum=sum(x))))), by=let, .SDcols=c("numbers1","numbers2")] [,.(Perc = numbers1.sum/sum(numbers1.sum)),by=let] 

A)私はこのdata.tableを使用して解決できますか?

b)私は上記スレッドがprop.tableを使用しているのを見ました。誰か私にこの機能の使い方を教えてもらえますか?

私は心から敬意を表します。

答えて

1

我々はdata.table

ばかな質問して申し訳ありません
res <- IData[, .(numbers1.mean = mean(numbers1), 
      numbers1.median = median(numbers1), 
      numbers2.mean=mean(numbers2), 
      sum.numbers1.n = sum(numbers1)), let 
      ][, perc.numbers1 := sum.numbers1.n/sum(sum.numbers1.n) 
      ][, c("let", "numbers1.mean", "numbers1.median", 
         "numbers2.mean", "perc.numbers1"), with = FALSE] 

head(res) 
# let numbers1.mean numbers1.median numbers2.mean perc.numbers1 
#1: N  10320.951   10473.0  9374.435 0.03567927 
#2: H  9683.590   9256.5  9328.035 0.03648391 
#3: L  10223.322   10226.0  9806.210 0.04005400 
#4: S  9922.486   9618.0  10233.849 0.03678742 
#5: C  9592.620   9226.0  9791.221 0.03517997 
#6: F  10323.867   10382.0  10036.561 0.03962035 
+0

と同様のアプローチを使用することができます。私は 'res'何も起こらないに上記のコードを割り当てない場合。これは 'dplyr'とは異なり、何も指定しなければ' dplyr'は結果を画面に出力しますが、 'data.table'の場合はこれは起こりません。それはなぜそうですか?私はあなたの考えを感謝します。 – watchtower

+1

@watchtwoer最初の '[]'をチェックすると、元のデータセットに列を作成せずに要約を行います。 ':='を代入するだけで、新しい列が作成されます。しかし、このコードでは、これは最初の '[]'の後に起こるので、元のデータは更新されません。 – akrun

+0

ご返信ありがとうございます、ご不便をおかけして申し訳ありません。私は ':='部分と、最初の '[] 'と' [] 'の違いを持っ​​ていると思います。 'res < - '部分(resへの代入)を取り出した場合、私はなぜ上記のコードが画面に何も印刷しないのか分かりません。結果を見るための唯一の方法は 'res'を実行することです。対照的に、 'dplyr'は何も割り当てられていなければ常に結果を出力します。今回私の質問がはっきりしていることを願っています。私はあなたの助けに感謝します。 – watchtower

関連する問題