2017-04-10 88 views
3

我是新手R程序員。我有以下一系列要點。如何選擇獨特點

df <- data.frame(x = c(1 , 2, 3, 4), y = c(6 , 3, 7, 5)) 
df <- df %>% mutate(k = 1) 
df <- df %>% full_join(df, by = 'k') 
df <- subset(df, select = c('x.x', 'y.x', 'x.y', 'y.y')) 
df 

有沒有辦法選擇「獨特」點? (該點的順序並不重要)

編輯:

x.x y.x x.y y.y 
1 6 2 3 
2 3 3 7 
. 
. 
. 

(我改變了2〜7澄清問題)

+0

我的預期產出將是6行(4選2)組合的所有要點。我會做一個編輯。 –

+0

應該在線上的所有4個值都被取消嗎?或只有一個x和y值? –

+0

對於我的4選擇2問題,我的「對象」應該是點對'x.x'和'y.x' –

回答

4

隨着data.table(從OP的初始工作df):

library(data.table) 
setDT(df) 

df[, r := .I ] 
df[df, on=.(r > r), nomatch=0] 


    x y r i.x i.y 
1: 2 3 1 1 6 
2: 3 2 1 1 6 
3: 4 5 1 1 6 
4: 3 2 2 2 3 
5: 4 5 2 2 3 
6: 4 5 3 3 2 

這是一個 「非相等連接」 的行號。在x[i, on=.(r > r)]中,左側r指的是x中的一行,右側是i的一行。名爲i.*的列取自i

Data.table聯接的形式爲x[i],使用i查找行xnomatch=0選項會刪除找不到匹配項的行i

+0

對於我的學習,r =是什麼意思? –

+1

哦,那只是在dplyr中創建行號,與mutate(r = row_number())相同,只是它通過引用將它添加到表中,所以不需要用'<-'分配結果。 – Frank

+0

哦,你正在對數據集進行非等距連接。通過data.table –

1

您可以使用基地的duplicated.matrix()函數來查找沒有複製器的行 - 這意味着實際上存在唯一的行。當您撥打duplicated()函數時,您必須澄清您只想使用第一個冒號。通過此調用,您可以檢查哪一行是唯一的。在第二步中,您將調用此數據行的所有列。

unique_lines = !duplicated.matrix(df[,c(1,2)]) 
df[unique_lines,] 
2

在tidyverse,您可以通過與tidyr::crossing自聯接節省一點的工作。如果添加行索引預連接,減少是一個簡單的filter電話:

library(tidyverse) 

df %>% mutate(i = row_number()) %>% # add row index column 
    crossing(., .) %>% # Cartesian self-join 
    filter(i < i1) %>% # reduce to lower indices 
    select(-i, -i1) # remove extraneous columns 

## x y x1 y1 
## 1 1 6 2 3 
## 2 1 6 3 7 
## 3 1 6 4 5 
## 4 2 3 3 7 
## 5 2 3 4 5 
## 6 3 7 4 5 

或在所有基礎R,

df$m <- 1 
df$i <- seq(nrow(df)) 
df <- merge(df, df, by = 'm') 
df[df$i.x < df$i.y, c(-1, -4, -7)] 

## x.x y.x x.y y.y 
## 2 1 6 2 3 
## 3 1 6 3 7 
## 4 1 6 4 5 
## 7 2 3 3 7 
## 8 2 3 4 5 
## 12 3 7 4 5 
+1

對於基礎R,還:'cb = combn(nrow(df),2 ); cbind(df [cb [1,],],df [cb [2,],])' – Frank

+0

我得到dplyr方法的錯誤。它說,當它進入過濾步驟時,它們是重複的列。有沒有方法來區分列? –

+0

@Frank是的,這是一個更直接的選擇。 – alistaire