[英]Subset a dataset based on the appearance of values in a column in R
我有一個包含兩列的數據集 (ds)。 “匹配”中有一個或兩個具有相同編號的條目。 “狀態”是一個二進制變量。 有成對的,例如match中的值12出現了兩次,一次是status為1的,一次是0。 然而,在比賽中也有沒有伴侶的觀察結果,在這個數據集中,沒有伴侶的是 3、8、33、17。
match status
12 1
3 1
5 0
8 1
33 0
5 1
12 0
17 0
我想要做的是創建一個新的數據集,它只包含對的觀察(因此如果一個值出現兩次)。 在我的例子中,它將是
match status
12 1
12 0
5 0
5 1
最終數據集中的狀態變量將為 50/50,因為匹配中的值(例如 12)有一個狀態 = 0 的觀察值和一個狀態 = 1 的觀察值。我使用的實際數據集有超過 50k 個觀察值,所以我不能只按每個數字搜索和過濾。 我試過的是:
numbers <- table(ds$match)
numbers <- as.data.frame(numbers)
numbers <- numbers[numbers$Freq == 2,]
numbers <- numbers$Var1
ds$keep <- ifelse(numbers %in% ds$match, 1, 0)
在這里我得到錯誤“替換有 23005 行,數據有 39021”如果我能解決這個錯誤我想我可以運行
ds <- filter(ds, ds$keep == 1)
獲取我想要的數據集。 這是我最有希望的方法。 我嘗試了一些其他的事情,但它總是因為狀態變量不是 50/50 的事實而完成,所以我無法在沒有一對的情況下排除所有觀察結果。 有人知道如何修復我的代碼,或者是否有更快/更流暢的解決方案? 提前感謝您的幫助!
library(dplyr)
ds %>% group_by(match) %>% filter(n()>1) %>% arrange(match,status)
match status
<dbl> <dbl>
1 5 0
2 5 1
3 12 0
4 12 1
你也可以這樣做:
ds <- ds[order(ds$match),]
id = rle(ds$match)
ds[ds$match %in% id$values[id$lengths>1],]
match status
<dbl> <dbl>
1 5 0
2 5 1
3 12 1
4 12 0
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.