我有以下问题:
我的数据框看起来像这样。我有价格,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}
但它不起作用。
感谢您的帮助
干杯 达尼
答案 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()
只采用标量逻辑(单TRUE
或FALSE
),{{1} }返回一个逻辑向量:
Name == "X"
在这些情况下,> with(dat, Name == "X")
[1] TRUE FALSE TRUE TRUE FALSE
是您的朋友。