我的数据如下:
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
答案 0 :(得分: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 :(得分:1)
基础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
答案 2 :(得分:0)
使用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))
答案 3 :(得分:0)
使用基础包的另外两个选项:
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.非常类似于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