计算 R 中每个 id 重复项的平均值

Counting the average of duplicates per id in R

我的数据是这样的:

id 日期
1 一个
1 一个
1 b
1 c
1 c
1 c
2 z
2 z
2 e
2 x

我想计算每个 id 重复项的平均值,即对于 id=1,我们有 2a 1b 3c 我希望输出为 2。 结果应该是这样的:

id 平均值
1 2
2 1.333

你可以试试tidyverse

library(tidyverse)
d %>% 
  group_by(id) %>% 
  count(date) %>% 
  summarise(mean = mean(n))
# A tibble: 2 x 2
     id  mean
  <int> <dbl>
1     1  2   
2     2  1.33

使用基础R你可以试试

foo <- function(x) mean(rle(x)$length)
aggregate(d$date, by=list(d$id), foo)

数据

d <- read.table(text ="id   date
1     a
1     a
1     b
1     c
1     c
1     c
2     a
2     a
2     e
2     z", header=T)

这里有一个包免费的解决方案

a = cbind(c(1,1,1,1,1,1,2,2,2,2),c('a','a','b','c','c','c','a','a','e','z'))
b = matrix(ncol = 2)[-1,]
for(i in unique(a[,1])){
  
  b=rbind(b,c(i,sum(table(a[a[,1]==i,2]))/length(table(a[a[,1]==i,2]))))
}

输出:

    [,1] [,2]              
[1,] "1"  "2"               
[2,] "2"  "1.33333333333333"

使用 data.table

library(data.table)
# dt <- your_data_frame %>% as.data.table()  ## convert to table from frame
dt[, .(N=.N), by = .(id,date)][, .(mean = mean(N)), by = id]

您可以使用 mean(table(date)) 获取计数平均值,将其应用于每个 id 值。

使用 dplyr -

library(dplyr)

df %>%
  group_by(id) %>%
  summarise(mean = mean(table(date)))

#     id  mean
#  <int> <dbl>
#1     1  2   
#2     2  1.33

或以 R 为基数 aggregate

aggregate(date~id, df, function(x) mean(table(x)))

另一个data.table选项

> setDT(df)[, .(Mean = .N / uniqueN(date)), id]
   id     Mean
1:  1 2.000000
2:  2 1.333333

dcast(setDT(df), id ~ date, fill = NA)[, .(Mean = rowMeans(.SD, na.rm = TRUE)), id]

给予

   id     Mean
1:  1 2.000000
2:  2 1.333333

我们可以使用

library(dplyr)
df1 %>%
     group_by(id) %>%
     summarise(Mean = count(cur_data(), date) %>% 
              pull(n) %>%
               mean)

使用 base 包的 table 方法:

at<-table(a$id,a$date)
apply(at,1,function(x) sum(x)/sum(x!=0))

#       1        2 
#2.000000 1.333333

数据集:

a = data.frame('id'=c(1,1,1,1,1,1,2,2,2,2),'date'=c('a','a','b','c','c','c','a','a','e','z'))