r - 在数据框中生成新列,按组计算重复项
问题描述
我想在数据集中生成一个新变量。此变量应计算由另一个变量定义的不同组中值的出现次数。
这是一个示例数据框:
x <- c(1, 1, 2, 3, 3, 3, 4, 4)
y <- c(5, 4, 4, 5, 5, 5, 1, 1)
dat <- data.frame(x, y)
dat
x y
1 1 5
2 1 4
3 2 4
4 3 5
5 3 5
6 3 5
7 4 1
8 4 1
现在我想生成一个新变量,我们称它为 z。z 应该按组计算 y 中重复出现的次数(由 x 定义的组:1、2、3、4)。因此,结果应如下所示:
x y z
1 1 5 1
2 1 4 1
3 2 4 1
4 3 5 1
5 3 5 2
6 3 5 3
7 4 1 1
8 4 1 2
有没有办法用 dplyr 做到这一点?
解决方案
一个选项是进行分组并创建一个序列列
library(dplyr)
dat %>%
group_by(x, y) %>%
mutate(z = row_number())
# A tibble: 8 x 3
# Groups: x, y [5]
# x y z
# <dbl> <dbl> <int>
#1 1 5 1
#2 1 4 1
#3 2 4 1
#4 3 5 1
#5 3 5 2
#6 3 5 3
#7 4 1 1
#8 4 1 2
还与base R
dat$z <- with(dat, ave(seq_along(x), x, y, FUN = seq_along))
或与data.table
library(data.table)
setDT(dat)[, z := seq_len(.N), .(x, y)]
或者更紧凑
setDT(dat)[, z := rowid(x, y)]
推荐阅读
- python - 在Python中将数据框转换为其他数据框的列
- python - 将 Aiohttp 与代理一起使用
- java - 计算二维数组中的特定条件
- c++ - 传递外围对象以用作嵌入式系统中的类成员
- bash - 获取 xml2 以将另一个命令的输出作为文件而不是指定名称读取?
- javascript - AngularJS 无法加载 Bing 地图
- consensus - 为什么少于3m+1的将军不能对付m个叛徒?
- javascript - 垃圾收集器支持的“未定义”或“空”
- javascript - 在 Node.js/express 中安全地将对象传递给客户端
- r - 通过 RSelenium 单击按钮