3 回答

TA貢獻1794條經驗 獲得超8個贊
注意:dplyr現在包含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條經驗 獲得超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的默認行為是distinct()僅返回...參數中指定的列。
為了獲得原始結果,您現在必須使用:
df %>% distinct(x, y, .keep_all = TRUE)

TA貢獻1772條經驗 獲得超5個贊
大多數時候,最好的解決方案是使用distinct()dplyr,正如已經建議的那樣。
但是,這是另一種使用slice()dplyr函數的方法。
# 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()功能的區別
此解決方案的優點是,它可以使從原始數據幀中保留哪些行變得明確,并且可以與該arrange()函數很好地配對。
假設您有客戶銷售數據,并且希望為每個客戶保留一條記錄,并且希望該記錄成為他們最近一次購買的記錄。然后,您可以編寫:
customer_purchase_data %>%
arrange(desc(Purchase_Date)) %>%
group_by(Customer_ID) %>%
slice(1)
- 3 回答
- 0 關注
- 1765 瀏覽
添加回答
舉報