簡體   English   中英

根據特定列計算重復行的頻率,但保留 R 中重復行之一的 ID

[英]Calculate the frequency of duplicated rows, based on specific columns, but keeping the ID of one of the duplicated rows in R

我正在嘗試根據特定列計算重復行的頻率,但我想保留每個重復行的 id,因為在合並其他數據集后我需要它。

這是我的示例數據

############
## Sample ##
############

ID=seq(from=1,to=12,by=1)
var1=c(rep("a",12))
var2=c(rep("b",12))
var3=c("c","c","b","d","e","f","g","h","i","j","k","k")
df=data.frame(ID,var1,var2,var3)

df
   ID var1 var2 var3
1   1    a    b    c
2   2    a    b    c
3   3    a    b    b
4   4    a    b    d
5   5    a    b    e
6   6    a    b    f
7   7    a    b    g
8   8    a    b    h
9   9    a    b    i
10 10    a    b    j
11 11    a    b    k
12 12    a    b    k

這是我的 function

freq.f<- function(data){
  vari=colnames(data[2:ncol(data)])
  data  %>%     
    dplyr:: count(!!! rlang::syms(vari))  %>%
    mutate(frequency = n/sum(n))
  
}

這是我的 output

freq.f(data=df)

   var1 var2 var3 n  frequency
1     a    b    b 1 0.08333333
2     a    b    c 2 0.16666667
3     a    b    d 1 0.08333333
4     a    b    e 1 0.08333333
5     a    b    f 1 0.08333333
6     a    b    g 1 0.08333333
7     a    b    h 1 0.08333333
8     a    b    i 1 0.08333333
9     a    b    j 1 0.08333333
10    a    b    k 2 0.16666667

如您所見,我將集合a,b,c復制了 2 次,對應於ID 1 和 2。我想要的是a,b,c ID = 1 ,對於集合a,b,k 所以想要的 output 就像

# desired output

   ID   var1 var2 var3 n  frequency
1  3     a    b    b   1  0.08333333
2  1     a    b    c   2  0.16666667
3  4     a    b    d   1  0.08333333
4  5     a    b    e   1  0.08333333
5  6     a    b    f   1  0.08333333
6  7     a    b    g   1  0.08333333
7  8     a    b    h   1  0.08333333
8  9     a    b    i   1  0.08333333
9  10    a    b    j   1  0.08333333
10 11    a    b    k   2  0.16666667

預先感謝您的幫助。

我們可以mutate來創建計數,然后filterslice或使用distinct

library(dplyr)
df %>% 
     group_by(var1, var2, var3) %>%
     mutate(n = n()) %>%
     ungroup %>% 
     distinct(var1, var2, var3, .keep_all = TRUE) %>% 
     mutate(frequency = n/sum(n))

-輸出

# A tibble: 10 x 6
#      ID var1  var2  var3      n frequency
#   <dbl> <chr> <chr> <chr> <int>     <dbl>
# 1     1 a     b     c         2    0.167 
# 2     3 a     b     b         1    0.0833
# 3     4 a     b     d         1    0.0833
# 4     5 a     b     e         1    0.0833
# 5     6 a     b     f         1    0.0833
# 6     7 a     b     g         1    0.0833
# 7     8 a     b     h         1    0.0833
# 8     9 a     b     i         1    0.0833
# 9    10 a     b     j         1    0.0833
#10    11 a     b     k         2    0.167 

或者使用add_count使其緊湊

df %>%
    add_count(var1, var2, var3) %>% 
    distinct(var1, var2, var3, .keep_all = TRUE) %>%
    mutate(frequency = n/sum(n))

或者如果我們使用count ,則使用原始數據執行right_join然后使用distinct

df %>% 
    count(var1, var2, var3) %>% 
    mutate(frequency = n/sum(n)) %>% 
    right_join(df) %>% 
    distinct(var1, var2, var3, .keep_all = TRUE)

基本 R 選項使用ave + duplicated + subset

subset(
  transform(
    transform(
      df,
      n = ave(ID, var1, var2, var3, FUN = length)
    ),
    frequency = n / nrow(df)
  ), 
  !duplicated(cbind(var1, var2, var3))
)

這使

   ID var1 var2 var3 n  frequency
1   1    a    b    c 2 0.16666667
3   3    a    b    b 1 0.08333333
4   4    a    b    d 1 0.08333333
5   5    a    b    e 1 0.08333333
6   6    a    b    f 1 0.08333333
7   7    a    b    g 1 0.08333333
8   8    a    b    h 1 0.08333333
9   9    a    b    i 1 0.08333333
10 10    a    b    j 1 0.08333333
11 11    a    b    k 2 0.16666667

下面是一個data.table選項

dt <- as.data.table(df)

dt[
  dt[
    ,
    n := .N, var1:var3
  ][
    , frequency := n / .N
  ][
    , !duplicated(.SD),
    .SDcols = var1:var3
  ]
]

這使

    ID var1 var2 var3 n  frequency
 1:  1    a    b    c 2 0.16666667
 2:  3    a    b    b 1 0.08333333
 3:  4    a    b    d 1 0.08333333
 4:  5    a    b    e 1 0.08333333
 5:  6    a    b    f 1 0.08333333
 6:  7    a    b    g 1 0.08333333
 7:  8    a    b    h 1 0.08333333
 8:  9    a    b    i 1 0.08333333
 9: 10    a    b    j 1 0.08333333
10: 11    a    b    k 2 0.16666667

暫無
暫無

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

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