簡體   English   中英

根據 R 中列中值的出現對數據集進行子集化

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM