我有一个带有id列的数据框,我想计算出同一id出现的频率(该列已排序)。我找到了一种方法,使用2 for循环,但这肯定是效率很低的。有人可以提出更好的解决方案吗?
id <- c(15580, 16144, 16144, 16144, 16144, 16144, 17985, 17985, 17985, 17985)
df <- data.frame(id)
df <- cbind(df, tmp=1)
for(i in 2:nrow(df)) {
if (df[i,1] == df[i-1,1]) {
df[i,2] <- df[i-1,2] + 1
}
}
df$cnt <- df$tmp
for(i in seq(nrow(df)-1,1,-1)){
if (df[i,1] == df[i+1,1]) {
df[i,3] <- df[i+1,3]
}
}
我的代码输出。列cnt包含我想要的计数。
id tmp cnt
1 15580 1 1
2 16144 1 5
3 16144 2 5
4 16144 3 5
5 16144 4 5
6 16144 5 5
7 17985 1 4
8 17985 2 4
9 17985 3 4
10 17985 4 4
第二步,仅获得此输出(仅唯一ID和计数)将是很好的:
id cnt
15580 1
16144 5
17985 4
答案 0 :(得分:1)
我们可以使用count
进行此操作,直接进入第二步
library(dplyr)
count(df, id)
# A tibble: 3 x 2
# id n
# <dbl> <int>
#1 15580 1
#2 16144 5
#3 17985 4
或者使用table
中的base R
table(df$id)
如果我们必须首先执行步骤1,请在按“ id”分组后使用transmute
stp1 <- df %>%
group_by(id) %>%
transmute(cnt = n())
然后从“ stp1”开始,使用distinct
distinct(stp1)