2017-11-03 11 views
0

生の発生データからネットワークグラフデータを生成しようとしています。生データでは、さまざまな状況で機能の発生率があります。異なる映画の俳優だとしましょう。各行は[コンテキスト、機能、重み]です。ここで、重みは画面時間の量です。ここではおもちゃのデータセットです:ファクタベクトルと合計値のペアワイズの組み合わせを計算する

df <- data.frame(context = sample(LETTERS[1:10], 500, replace=TRUE), 
      feature = sample(LETTERS, 500, replace=TRUE), 
      weight = sample(1:100, 500, replace=TRUE) 
      ) 

ムービーAのためにそう、私たちは、各行は俳優の名前と、その映画の中で自分の画面の時間である20行を持っているかもしれません。

私が生成したいのは、それぞれのムービーのすべてのアクターのペアごとの組み合わせで、それぞれのウェイトの合計です。だから、例えば、我々が開始した場合:

[A, A, 5] 
[A, B, 2] 

私は[コンテキスト、特長1、特徴2、sum.weight]の形式で出力したいと思います。だから、:

[A, A, B, 7] 

私は、forループの組み合わせでこれを介して実行する方法を知っているが、私は特に、データのようなもので、これに近づくより「古典R」方法があるかどうかを知りたいのです。表。ここで

答えて

1

data.tableパッケージを使用して可能なソリューションです:

library(data.table) 

# keep a record of feature's levels 
feature.levels <- levels(df$feature) 

# for each context, create a data table for all pair combinations of features, 
# & sum of said pair's weights 
df <- df[, 
    as.data.table(
    cbind(t(combn(feature, 2)), 
      rowSums(t(combn(weight, 2)))) 
    ), 
    by = context] 

# map features (converted into integers in the previous step) back to factors 
df[, 
    c('V1', 'V2') := lapply(.SD, 
          function(x){factor(x, labels = feature.levels)}), 
    .SDcols = c('V1', 'V2')] 

# rename features/sum weights 
setnames(df, 
     old = c("V1", "V2", "V3"), 
     new = c("feature1", "feature2", "sum.weights")) 

> head(df) 
    context feature1 feature2 sum.weights 
1:  C  j  l   373 
2:  C  j  z   282 
3:  C  j  v   382 
4:  C  j  h   488 
5:  C  j  c   280 
6:  C  j  u   360 

データ(それは大文字「文脈」から視覚的に区別だように、私は「機能」のための下部ケースを使用):

set.seed(123) 
df <- data.frame(context = sample(LETTERS[1:10], 500, replace=TRUE), 
       feature = sample(letters, 500, replace=TRUE), 
       weight = sample(1:100, 500, replace=TRUE)) 

# convert to data table & summarize to unique combinations by context + feature 
setDT(df) 
df <- df[, 
     list(weight = sum(weight)), 
     by = list(context, feature)] 
+0

感謝!このような徹底的な答えを提供する時間を取っていただき、本当にありがとうございます。これは、私が他の人々がこれにどのようにアプローチするかを見るのに役立ちます。 – Runic

関連する問題