2014-09-12 57 views
1

我想了解下面的代碼實際上做了什麼。我的意圖是用df1的「Pop」列中的數據填充df2中的Pop列,並按列ID「ID」匹配行。R數據框索引中的比較有什麼作用?

df2$Pop <- df1[df1$ID == df2$ID,]$Pop 

它似乎直線前進,如果該行並沒有排序(它可以只是尋找匹配ID的一個),但如果一個數據幀是比其他(有更多行)大? comarison的順序是否重要?我不確定從上一行代碼中可以期待什麼。它是否像merge一樣工作(如果在df1中,我只有ID和Pop列)?如果是這樣,爲什麼這兩個版本(優點/缺點)?

df2 <- merge(df2, df1, by = "ID", all = FALSE, sort=FALSE) 

通過用不同數目的行(DF1 100.000行和與98.530 DF2),其中DF1只具有ID和流行列,但DF2具有超過4000的列測試在數據幀中的兩個版本,該第一版本給我瞬間得到了一個結果,而merge版本需要大約8秒的時間才能運行。我是R新手,所以我甚至不知道如何測試輸出並檢查它們是否相同,但它們應該是什麼?

+1

如果'df2 $ ID'大於1,則應該使用'%in%'而不是'==' – 2014-09-12 18:26:18

+0

@RichardScriven你能解釋爲什麼嗎?如果行沒有排序,它會有所作爲嗎? – MeloMCR 2014-09-12 23:00:11

回答

0

比較運算符,==在這種情況下,返回一個邏輯矢量(具有TRUEFALSE作爲條目的載體)的其是否在數據幀索引或不考慮具體。它取兩個對象,並訪問(按位置排列)這些位置的值是否相等。如果是,則返回TRUE,如果不是,則返回新對象的相同位置,然後FALSE。隨後,通過方括號[]將該邏輯向量傳遞到df1,導致df1被子集化,僅返回與邏輯向量爲TRUE的位置相關聯的值。請注意,df1$Pop是一個矢量。 df1是一個數據框。

舉例來說

V1 <- c(1,2,3) 
V2 <- c(1,3,2) 
V1==V2 
## TRUE FALSE FALSE 
V1[V2==V1] 
## 1 
V1[c(TRUE,FALSE,FALSE)] 
## 1 

在您的例子來說,你正在做的是子集劃分的數據幀,返回只有在ID相同的行,抓住$流行行,並把它在df2 $ Pop中。

這與合併有所不同。合併需要兩個數據幀,並且做任何有意義的事情,數據幀應該至少有兩列。然後它查找一個數據框的行(使用by列)並將它們粘貼到另一個數據行的行旁邊。在SQL中說,它執行JOIN

例如:

df1<- data.frame(ID=1:3,V1=letters[1:3]) 
df1 
## ID V1 
##1 1 a 
##2 2 b 
##3 3 c 
df2<- data.frame(ID=c(1,3),V2=letters[3:4]) 
df2 
## ID V2 
##1 1 c 
##2 3 d 
merge(df1,df2,by="ID") 
## ID V1 V2 
##1 1 a c 
##2 3 c d 
df1[df1$ID==df2$ID,]$V1 
##[1] a 

通常,爲了測試兩個表達式的結果,取表達式的結果,並使用等式比較操作符:

V1 == V2 
## TRUE FALSE FALSE 

或者使用all()到得到一個單一的結果。

all(V1==V2) 
## FALSE 

還有其他方法來測試對象是否相同。 See this stackoverflow answer.

+1

您可能需要'%in%'而不是'==' – 2014-09-12 18:20:46