匹配列,在R中创建循环

时间:2010-12-08 14:27:37

标签: r loops matching

我有以下问题:

我的数据框看起来像这样。我有价格,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& Rs,并删除其余部分。所以这应该是:2 X和2'Rs(在这种情况下)。

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,Price = 120& R,价格= 120日期1.但也有价格只匹配一个名称,例如只有Name = X的价格= 140.所以我想要R做的是:检查加工名称为一个价格(即一个X和一个R存在相同的价格)并删除其余的价格。实际上会产生相同数量的X和R,因为我正在寻找配对。

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

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

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

但它不起作用。

感谢您的帮助

干杯 达尼

1 个答案:

答案 0 :(得分:0)

编辑: @Dwin对Q的评论有点神秘,看到我第一次尝试Q的第一部分是不正确的,因为Q不清楚,我会尝试兑换我自己去扩展DWin的评论:

[假设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),{{1} }返回一个逻辑向量:

Name == "X"

在这些情况下,> with(dat, Name == "X") [1] TRUE FALSE TRUE TRUE FALSE 是您的朋友。