2010-12-08 104 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()是你的朋友。