3 回答

TA貢獻1794條經(jīng)驗 獲得超8個贊
注意:dplyr現(xiàn)在包含distinct用于此目的的功能。
原始答案如下:
library(dplyr)
set.seed(123)
df <- data.frame(
x = sample(0:1, 10, replace = T),
y = sample(0:1, 10, replace = T),
z = 1:10
)
一種方法是分組,然后僅保留第一行:
df %>% group_by(x, y) %>% filter(row_number(z) == 1)
## Source: local data frame [3 x 3]
## Groups: x, y
##
## x y z
## 1 0 1 1
## 2 1 0 2
## 3 1 1 4
(在dplyr 0.2中,您將不需要啞z變量,并且只需要編寫即可row_number() == 1)
我也一直在考慮添加一個slice()功能,如:
df %>% group_by(x, y) %>% slice(from = 1, to = 1)
或者,也許可以通過變種來unique()選擇要使用的變量:
df %>% unique(x, y)

TA貢獻1789條經(jīng)驗 獲得超8個贊
這是使用的解決方案dplyr 0.3。
library(dplyr)
set.seed(123)
df <- data.frame(
x = sample(0:1, 10, replace = T),
y = sample(0:1, 10, replace = T),
z = 1:10
)
> df %>% distinct(x, y)
x y z
1 0 1 1
2 1 0 2
3 1 1 4
更新為dplyr 0.5
dplyr版本0.5的默認(rèn)行為是distinct()僅返回...參數(shù)中指定的列。
為了獲得原始結(jié)果,您現(xiàn)在必須使用:
df %>% distinct(x, y, .keep_all = TRUE)

TA貢獻1772條經(jīng)驗 獲得超5個贊
大多數(shù)時候,最好的解決方案是使用distinct()dplyr,正如已經(jīng)建議的那樣。
但是,這是另一種使用slice()dplyr函數(shù)的方法。
# Generate fake data for the example
library(dplyr)
set.seed(123)
df <- data.frame(
x = sample(0:1, 10, replace = T),
y = sample(0:1, 10, replace = T),
z = 1:10
)
# In each group of rows formed by combinations of x and y
# retain only the first row
df %>%
group_by(x, y) %>%
slice(1)
與使用distinct()功能的區(qū)別
此解決方案的優(yōu)點是,它可以使從原始數(shù)據(jù)幀中保留哪些行變得明確,并且可以與該arrange()函數(shù)很好地配對。
假設(shè)您有客戶銷售數(shù)據(jù),并且希望為每個客戶保留一條記錄,并且希望該記錄成為他們最近一次購買的記錄。然后,您可以編寫:
customer_purchase_data %>%
arrange(desc(Purchase_Date)) %>%
group_by(Customer_ID) %>%
slice(1)
- 3 回答
- 0 關(guān)注
- 1763 瀏覽
添加回答
舉報