Sqldf 的数据计数

Count of data by Sqldf

我的数据如下:

 ID   category
101          A
101          B
101          C
102          A
103          B
103          C

我想要这样的结果:

 ID   category Count 
101          A     3
101          B     3
101          C     3
102          A     1
103          B     2
103          C     2

我试过类似的东西:

data<-sqldf("select *,count(ID) as count from data group by ID")

它显示输出为:

 ID   category  count
101          C      3
102          A      1
103          C      2

一个选项使用data.table

library(data.table)
setDT(df1)[, Count:=.N, ID]
#    ID category Count
#1: 101        A     3
#2: 101        B     3
#3: 101        C     3
#4: 102        A     1
#5: 103        B     2
#6: 103        C     2

或使用dplyr

library(dplyr)
df1 %>%
    group_by(ID) %>%
    mutate(Count=n())

或使用base R

 df1$Count <- with(df1, ave(seq_along(ID), ID, FUN=length))

基础R方法:

transform(df, count=table(ID)[as.character(ID)])
#   ID category count
# 1 101        a     3
# 2 101        b     3
# 3 101        c     3
# 4 102        a     1
# 5 103        b     2
# 6 103        c     2

对于所有 SQL 解决方案,将您的代码输出(省略 category 除外)与原始数据框连接起来,如下所示:

library(sqldf)
sqldf("select * from data
       left join (select ID, count(ID) as count from data group by ID)
       using (ID)")

给予:

   ID category count
1 101        A     3
2 101        B     3
3 101        C     3
4 102        A     1
5 103        B     2
6 103        C     2

注意:这是可重现形式的输入数据:

Lines <- "ID   category
101          A
101          B
101          C
102          A
103          B
103          C"
data <- read.table(text = Lines, header = TRUE)

另外两个使用基础包的选项:

1.

merge(df, table(df$ID), by.x = "ID", by.y = "Var1")

输出:

   ID category Freq
1 101        A    3
2 101        B    3
3 101        C    3
4 102        A    1
5 103        B    2
6 103        C    2

2.Very类似于akrun

提出的那个
df$count <- ave(df$ID, df$ID, FUN=length)
df

输出:

   ID category count
1 101        A     3
2 101        B     3
3 101        C     3
4 102        A     1
5 103        B     2
6 103        C     2