2012-02-25 47 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) 

我的期望的輸出將是創建在所述數據幀「MOD」,這將是一些新的矢量像

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三個要素,並且其中每一元素是具有兩列的矩陣。所以ID2

1 5.00
2 1.00
編輯:使用split在另一個答案是更清潔。

然後,

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 

當然,你可以做一個循環或lapply填寫所有的ID插槽。

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 

這是我認爲的split()輸出(我所說的以上ID.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

事實後了一點,但我只想說,這是完美的。正是我想要的,儘管卡爾的解決方案也適用。如果可以的話,我會加倍努力。非常感謝。 – 2012-03-04 20:15:58