簡體   English   中英

基於另一列標記 id 在 R 中具有不同的值

[英]Flagging an id based on another column has different values in R

我有一個需要應用的標記規則。

這是我的數據集的樣子:

    df <- data.frame(id = c(1,1,1,1, 2,2,2,2, 3,3,3,3),
                 key = c("a","a","b","c", "a","b","c","d", "a","b","c","c"),
                 form = c("A","B","A","A", "A","A","A","A", "B","B","B","A"))
    
    > df
   id key form
1   1   a    A
2   1   a    B
3   1   b    A
4   1   c    A
5   2   a    A
6   2   b    A
7   2   c    A
8   2   d    A
9   3   a    B
10  3   b    B
11  3   c    B
12  3   c    A

我想根據具有重復項的key列標記idform的第三列顯示每個key的不同形式。 這個想法是要了解一個 id 是否從多個表單中獲取了任何項目。 我需要添加一個過濾列,如下所示:

> df.1
   id key form type
1   1   a    A multiple
2   1   a    B multiple
3   1   b    A multiple 
4   1   c    A multiple
5   2   a    A single
6   2   b    A single
7   2   c    A single
8   2   d    A single
9   3   a    B multiple
10  3   b    B multiple
11  3   c    B multiple
12  3   c    A multiple

最終我需要擺脫具有不同form的額外重復行。 為了決定哪一個重復的下降,我選擇具有更多項目的form類型。

在最終的單獨數據集中,我希望有如下內容:

  > df.2
       id key form type
    1   1   a    A multiple
    3   1   b    A multiple 
    4   1   c    A multiple
    5   2   a    A single
    6   2   b    A single
    7   2   c    A single
    8   2   d    A single
    9   3   a    B multiple
    10  3   b    B multiple
    11  3   c    B multiple

所以第一個idform A占主導地位,所以保留了A ,第三個idform B占主導地位,所以保留了B

有任何想法嗎? 謝謝!

我們可以檢查不同元素的數量以按組創建新列,然后根據最高頻率( Mode )進行filter

library(dplyr)
df.2 <- df %>% 
  group_by(id) %>%
  mutate(type = if(n_distinct(form) > 1) 'multiple' else 'single') %>% 
  filter(form == Mode(form)) %>%
  ungroup

-輸出

> df.2
# A tibble: 10 × 4
      id key   form  type    
   <dbl> <chr> <chr> <chr>   
 1     1 a     A     multiple
 2     1 b     A     multiple
 3     1 c     A     multiple
 4     2 a     A     single  
 5     2 b     A     single  
 6     2 c     A     single  
 7     2 d     A     single  
 8     3 a     B     multiple
 9     3 b     B     multiple
10     3 c     B     multiple

在哪里

Mode <- function(x) {
  ux <- unique(x)
  ux[which.max(tabulate(match(x, ux)))]
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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