1

データ フレーム内のデータを別の方法で見る必要があります。ここに問題があります..

次のようなデータフレームがあります

Person  Item  BuyOrSell
1        a    B
1        b    S
1        a    S
2        d    B
3        a    S
3        e    S

私が持っている要件の 1 つは、次のようにデータを表示することです。個人が行ったすべての取引の合計を取引タイプ (B または S) ごとに分けて表示します。

Person    aB   aS   bB   bS   dB   dS   eB   eS
1          1    1    0    1    0    0   0     0
2          0    0    0    0    1    0   0     0
3          1    0    0    0    0    0   0     1

そこで、新しい列を作成し、Item と BuyOrSell の両方の値を追加しました。

df$newcol<-paste(Item,"-",BuyOrSell,sep="")
table(Person,newcol) 

となり、上記の結果を得ることができました。

クラックするのが難しいナットであった最後の変換要件は次のとおりでした....

  aB   aS   bB   bS   dB   dS   eB   eS
aB 1    1    0    1    0   0     0   0
aS 1    2    0    1    0   0     0   1
bB 0    0    0    0    0   0     0   0
bS 1    1    0    0    0   0     0   0
dB 0    0    0    0    1   0     0   0
dS 0    0    0    0    0   0     0   0
eB 0    0    0    0    0   0     0   0
eS 0    1    0    0    0   0     0   1

上記の表には、特定の取引を行い、別のアイテムの取引も行った人の数を記入する必要がありました。

試してみtable(newcol,newcol)ましたが、aB-aB、aS-aS、bB-bB、.....のカウントのみが生成され、他のすべての組み合わせでは0が生成されました。

このナットをクラックできるパッケージまたはコマンドに関するアイデアはありますか?

4

3 に答える 3

3

最終結果は次のとおりではありませんか。

# Following Ricardo's solution for casting, but using `acast` instead
A <- acast(Person~Item+BuyOrSell,data=df,fun.aggregate=length,drop=FALSE)

# A' * A
> t(A) %*% A
#     a_B a_S b_B b_S d_B d_S e_B e_S
# a_B   1   1   0   1   0   0   0   0
# a_S   1   2   0   1   0   0   0   1
# b_B   0   0   0   0   0   0   0   0
# b_S   1   1   0   1   0   0   0   0
# d_B   0   0   0   0   1   0   0   0
# d_S   0   0   0   0   0   0   0   0
# e_B   0   0   0   0   0   0   0   0
# e_S   0   1   0   0   0   0   0   1
于 2013-03-14T22:51:32.260 に答える
1

もっと良い方法があると思いますが、これがパッケージを使用する方法reshape2です。

require(reshape2)
#reshapes data so each item and buy/sell event interaction occurs once
df2 <- dcast(Person~Item+BuyOrSell,data=df,fun.aggregate=length,drop=FALSE)
df2
  # Person a_B a_S b_B b_S d_B d_S e_B e_S
# 1      1   1   1   0   1   0   0   0   0
# 2      2   0   0   0   0   1   0   0   0
# 3      3   0   1   0   0   0   0   0   1

#reshapes data so every row is an interaction by person
df3 <- melt(df2,id.vars="Person")
head(df3)
     # Person variable value
# 1       1      a_B     1
# 2       2      a_B     0
# 3       3      a_B     0
# 4       1      a_S     1
# 5       2      a_S     0
# 6       3      a_S     1

#removes empty rows where no action occurred
#removes value column
df4 <- with(df3,
  data.frame(Person=rep.int(Person,value),variable=rep.int(variable,value))
#performs a self-merge: now each row is 
#every combination of two actions that one person has done
df5 <- merge(df4,df4,by="Person")
head(df5)
  # Person variable.x variable.y
# 1      1        a_B        a_B
# 2      1        a_B        a_S
# 3      1        a_B        b_S
# 4      1        a_S        a_B
# 5      1        a_S        a_S
# 6      1        a_S        b_S

#tabulates variable interactions
with(df5,table(variable.x,variable.y))
于 2013-03-14T21:03:52.660 に答える
0

ブルーマジスター、あなたのソリューションは完璧に機能し、私はあなたが実行したすべてのステップを分析しました。

df4の出力は次のとおりです。

 Person variable
1      1      a_B
2      1      a_S
3      3      a_S
4      1      b_S
5      2      d_B
6      3      e_S

の出力with(df5,table(variable.x,variable.y))

variable.y
variable.x a_B a_S b_B b_S d_B d_S e_B e_S
       a_B   1   1   0   1   0   0   0   0
       a_S   1   2   0   1   0   0   0   1
       b_B   0   0   0   0   0   0   0   0
       b_S   1   1   0   1   0   0   0   0
       d_B   0   0   0   0   1   0   0   0
       d_S   0   0   0   0   0   0   0   0
       e_B   0   0   0   0   0   0   0   0
       e_S   0   1   0   0   0   0   0   1

それはまさに私が欲しいものです。

d4の出力を見ると、私のnewcolソリューション(pasteを使用)とほぼ同じでした。

> df
  Person newcol
1      1    a-B
2      1    b-S
3      1    a-S
4      2    d-B
5      3    a-S
6      3    e-S

ここでの唯一の違いは、df4と比較した場合の行の順序です。

だから、私はこのコマンドを実行することになりました

dfx <- merge(df,df,by="Person")
 with(dfx,table(newcol.x,newcol.y)) 

そしてそれは次を生成しました...

    newcol.y
newcol.x a-B a-S b-S d-B e-S
     a-B   1   1   1   0   0
     a-S   1   2   1   0   1
     b-S   1   1   1   0   0
     d-B   0   0   0   1   0
     e-S   0   1   0   0   1

上記の出力は、いくつかの行と列を無視しました。私はあなたと何が違うのですか?

于 2013-03-14T22:34:42.160 に答える