2012-02-25 64 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

相关问题