2010-12-08 79 views
1

我有以下问题:匹配列,在R中创建循环

我有数据框,看起来像这样。我有价格,3 X和2 R的。

Date Name Price Interest 
01.02.10 X 120  0.2 
01.02.10 R 120  0.3 
01.02.10 X 130  0.8 
01.02.10 X 140  0.4 
01.02.10 R 130  0.2 
etc. 

我想告诉R键找对X与同价位的&卢比,并删除其余。所以这应该导致:2个X和2个R(在这种情况下)。

Date Name Price Interest 
01.02.10 X 120  0.2 
01.02.10 R 120  0.3 
01.02.10 X 130  0.8 
01.02.10 R 130  0.2 
etc. 

为了使它更清晰(希望):我有很多不同的价格为每个日期。每一行中都有一个X或一个R。每个日期有很多对,例如X,价格= 120 & R,价格= 120日期1.但也有价格只与一个名称相匹配,例如,价格= 140仅适用于名称= X.所以我想要R做的是:检查一个价格的机器名称(即存在一个X和一个R相同的价格)并删除其余部分。实际上会导致X和R的数量相同,因为我正在寻找配对。

我很抱歉不能发布我试过的东西。我什么都想不起来。

现在,到下一个问题: 如果对在那里,我想告诉R检查每一行。如果名称是X,我希望它计算新的价格,如果不是只打印现有价格。 我试过

xx <- if(Name == "X"){Price + 100*interest} else print{Price} 

但它没有工作。

感谢您的帮助

干杯 达尼

+0

您需要更好地解释第一部分的逻辑。 “寻找名称和价格对”对我来说没有任何意义。对于第二部分,可以使用`ifelse()`而不是`if()... else`,因为前者是矢量化的。 – Shane 2010-12-08 14:33:15

+0

好的谢谢。我想寻找价格和名称的匹配。所以我在我的数据框中有很多日期,它们有名称X或R.对于每个日期,我也有价格观察。现在,对于每个日期,应该有一对X&R上的一个价格,例如,日期1,x,价格= 120和日期1,r,价格= 120.还有其他观察不具有匹配,即例如日期1,x,价格= 140,而没有日期1,r,价格= 140.我想告诉R检查匹配(即X和R在每个日期相同的价格),并删除其余的。现在更清楚了吗?谢谢谢恩 – Dani 2010-12-08 14:53:26

回答

0

编辑: @迪文的评论到Q是一个有点神秘,看到我的第一次尝试在Q的第1部分是不正确的,由于不清楚的问题,我会尝试在扩展迪文的评论时兑换自己:

[假设dat包含您在Q中引用的数据。首先,合并dat与自身:

> foo <- merge(dat[, -4], dat, by.x = "Date", by.y = "Date") 
> head(foo) 
     Date Name.x Price.x Name.y Price.y Interest 
1 01.02.10  X  120  X  120  0.2 
2 01.02.10  X  120  R  120  0.2 
3 01.02.10  X  120  X  130  0.2 
4 01.02.10  X  120  X  140  0.2 
5 01.02.10  X  120  R  130  0.2 
6 01.02.10  R  120  X  120  0.2 

下,走出这里Price.x == Price.y其中Name.x != Name.y

> (foo <- foo[with(foo, which(Price.x == Price.y & Name.x != Name.y)),]) 
     Date Name.x Price.x Name.y Price.y Interest 
2 01.02.10  X  120  R  120  0.2 
6 01.02.10  R  120  X  120  0.2 
15 01.02.10  X  130  R  130  0.2 
23 01.02.10  R  130  X  130  0.2 

然后,甩掉多余的列行:

> (foo <- foo[, -(4:5)]) 
     Date Name.x Price.x Interest 
2 01.02.10  X  120  0.2 
6 01.02.10  R  120  0.2 
15 01.02.10  X  130  0.2 
23 01.02.10  R  130  0.2 

最后,修正列名:

> names(foo) <- names(dat) 
> foo 
     Date Name Price Interest 
2 01.02.10 X 120  0.2 
6 01.02.10 R 120  0.2 
15 01.02.10 X 130  0.2 
23 01.02.10 R 130  0.2 

的第二件事可以用ifelse

with(dat, ifelse(Name == "X", Price + 100*Interest, Price)) 

其中给出这个东西

> with(dat, ifelse(Name == "X", Price + 100*Interest, Price)) 
[1] 140 120 150 160 130 

if()不工作的原因来完成,是if()只需要标量逻辑(单个TRUEFALSE),但Name == "X"返回al ogical vector:

> with(dat, Name == "X") 
[1] TRUE FALSE TRUE TRUE FALSE 

在这些情况下,ifelse()是你的朋友。