2015-09-28 31 views
1

之間的關係,考慮下面的數據幀:找到一個對一個,一到多,多到一列

first_name last_name 
1   Al  Smith 
2   Al  Jones 
3  Jeff Thompson 
4  Scott Thompson 
5  Terry Dactil 
6  Pete  Zah 

data <- data.frame(first_name=c("Al","Al","Jeff","Scott","Terry","Pete"), 
        last_name=c("Smith","Jones","Thompson","Thompson","Dactil","Zah")) 

在這個數據幀中,有三種方式FIRST_NAME正在有關姓氏:

  • 一對一(即,存在如first_name 和last_name之間的獨特關係)
  • 一對多(即,一個如first_name點被用於多個 last_name的值)
  • 多對一(即多個FIRST_NAME值指向 一個姓氏)

我希望能夠各自的三種情況,並將其輸出到快速確定數據幀。因此,得出的數據幀將是:

一對一

first_name last_name 
1  Terry Dactil 
2  Pete  Zah 

一對多

first_name last_name 
1   Al  Smith 
2   Al  Jones 

多對一

first_name last_name 
1  Jeff Thompson 
2  Scott Thompson 

我想內做到這一點dplyr軟件包。

+2

你想'duplicateated()'函數 –

+0

[這裏](http://www.cookbook-r.com/Manipulating_data/Finding_and_removing_duplicate_records/)是一些使用'duplicated()'的例子代碼,但我認爲它會如果你能給我們一些具體的東西,請冷靜一下,@RichardScriven。我並不是想解決這個問題。 TY。 –

回答

6

通常,您可以使用duplicated函數(如@RichardScriven在您的問題的評論中提到的)檢查值是否重複。然而,在默認情況下此功能不會因爲重複標記出現多次的元素的第一個實例:

duplicated(c(1, 1, 1, 2)) 
# [1] FALSE TRUE TRUE FALSE 

既然你也想拿起這些情況下,您通常會希望每個向量運行duplicated兩次,一次向前和向後一次:

duplicated(c(1, 1, 1, 2)) | duplicated(c(1, 1, 1, 2), fromLast=TRUE) 
# [1] TRUE TRUE TRUE FALSE 

我覺得這是一個很大的打字,所以我會定義來​​檢查,如果出現某個元素的輔助函數不止一次:

d <- function(x) duplicated(x) | duplicated(x, fromLast=TRUE) 

現在,你想要的邏輯是所有簡單的俏皮話:

# One to one 
data[!d(data$first_name) & !d(data$last_name),] 
# first_name last_name 
# 5  Terry Dactil 
# 6  Pete  Zah 

# One to many 
data[d(data$first_name) & !d(data$last_name),] 
# first_name last_name 
# 1   Al  Smith 
# 2   Al  Jones 

# Many to one 
data[!d(data$first_name) & d(data$last_name),] 
# first_name last_name 
# 3  Jeff Thompson 
# 4  Scott Thompson 

請注意,您還可以使用table函數定義dduplicated的幫助:

d <- function(x) table(x)[x] > 1 

雖然這種替代定義稍微簡潔些,我也覺得它不太可讀。

+4

我有點兒希望我的名字是特里達克蒂爾現在 –

+0

@RichardScriven我會期待「特里Dactyl」,但是,這將是一個偉大的談話起動器! – josliber

+0

是不會把'function(x)duplicated(x)'和'duplicated(x,fromLast = TRUE)'看作是兩個獨立的部分? –