2012-02-25 7 views
1

内のリストには、私は私の所望の出力がものになるだろう、データフレーム「モッズ」の新しいベクトルを作成することです以下試合、ベクトル

ID <- c("ID1", "ID1", "ID1", "ID2", "ID2", "ID3") 
ModNum <- c(1, 2, 3, 1, 2, 0) 
Amnt <- c(2.00, 3.00, 2.00, 5.00, 1.00, 5.00) 
df <- data.frame(ID, ModNum, Amnt) 

のような形式のベクターを用いたデータフレームを持っている場合like

ID Mod 
ID1 ((1,2.00), (2, 3.00), (3, 2.00)) 
ID2 ((1, 5.00), (2, 1.00)) 
ID3 ((0, 5.00)) 

次に、冗長IDを削除します。

私はtapplyを使用してIDにルーピングしてリストに追加することを検討しましたが、これについてどうやってどうやって対処するか混乱しています。

How to add variable key/value pair to list object?

`tapply()` to return data frame

答えて

0

Modと呼ばれるあなたのデータフレームがID1 , ID2, ID3という3つの要素を持っており、それらの要素のそれぞれは、2列の行列であるように、私は、少し違った出力を整理することをお勧めします。他の回答のようにsplitを使用して非常にきれいである:だからID2

1 5.00
2 1.00
編集は次のようになります。

その後、

Rgames> df<-as.list(1:length(unique(ID))) 
Rgames> names(df)<-unique(ID) 
Rgames> df$ID1<-cbind(ModNum[ID=="ID1"],Amnt[ID=="ID1"]) 
Rgames> df 
$ID1 
    [,1] [,2] 
[1,] 1 2 
[2,] 2 3 
[3,] 3 2 

$ID2 
[1] 2 

$ID3 
[1] 3 

そしてもちろん、あなたは、すべてのIDのスロットを埋めるためにループまたはlapplyを行うことができます。

1

ここにはsplit()を使用する解決策があります。

> ID.split <- split(df[-1], df$ID) 
> ID.split 
$ID1 
    ModNum Amnt 
1  1 2 
2  2 3 
3  3 2 

$ID2 
    ModNum Amnt 
4  1 5 
5  2 1 

$ID3 
    ModNum Amnt 
6  0 5 

> 
> flat.list <- lapply(ID.split, function(x)as.vector(t(x))) 
> df <- data.frame(ID = names(flat.list)) 
> df$Mod <- flat.list 
> df 
    ID    Mod 
1 ID1 1, 2, 2, 3, 3, 2 
2 ID2  1, 5, 2, 1 
3 ID3    0, 5 

は、それは(私は上記ID.splitを呼んだもの)split()の出力はあなたが求めて最終出力よりもプログラミングの観点からで動作するようにより良いdata.structureであるというのが私の意見です。

1

plyr packageのもう一つの解決策:

df$Mod <- sprintf("(%i, %.2f)", df$ModNum, df$Amnt) # prepare format 

library(plyr) 
ddply(df, .(ID), summarise, Mod=paste(Mod, collapse=", ")) 
# ID        Mod 
# 1 ID1 (1, 2.00), (2, 3.00), (3, 2.00) 
# 2 ID2   (1, 5.00), (2, 1.00) 
# 3 ID3      (0, 5.00) 
+0

ビット事実の後、私はちょうどこれは完璧だったことを言いたかったです。まさに私が望んでいたものですが、Carlのソリューションも同様に機能します。私はできればアップヴォートするだろう。どうもありがとうございます。 –