r - 如何计算列中的重复项?
问题描述
我有一个带有 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
解决方案
我们可以这样做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 步,请transmute
在按 'id' 分组后使用
stp1 <- df %>%
group_by(id) %>%
transmute(cnt = n())
然后从'stp1',使用distinct
distinct(stp1)
推荐阅读
- python - 'pip==9.0.1' 分发未找到并且是应用程序需要的
- ffmpeg - FFmpeg - 由于覆盖过滤器,从 webm 文件生成波形图像不起作用
- visual-studio-code - Terraform - 在 IDE 中自动填充所需的属性
- javafx - JavaFX 中的 ImageView 无效 URL 问题
- python - 构造 JSON 变量时出错?
- css - 在网站中使用哪个字体文件?
- reactjs - 从函数内触发事件
- mbedtls - 如何使用 mbedtls 从证书中提取单个 OID?
- php - 通过 Webhook 发送的 Slack 消息中出现了不需要的表情符号
- html - 当我点击它时,按钮不会打开