R语言 创建重复值序列,长度基于向量

cnjp1d6j  于 2023-09-27  发布在  其他
关注(0)|答案(1)|浏览(85)

我如何用数字序列填充列'Night',每个数字重复3次,并且序列基于列'Site'重新开始?我创建了一个表格,显示我想要实现的目标。这是我的问题的简化版本,我需要能够在更大的dataframe上使用代码。
Image of table
| 研究中心日期时间|网站|晚上|
| --|--|--|
| 1_01012023_2200| 1 | 1 |
| 1_01012023_2300| 1 | 1 |
| 1_02012023_0000| 1 | 1 |
| 1_02012023_2200| 1 | 2 |
| 1_02012023_2300| 1 | 2 |
| 1_03012023_0000| 1 | 2 |
| 2_01012023_2100| 2 | 1 |
| 2_01012023_2200| 2 | 1 |
| 2_01012023_2300| 2 | 1 |
| 2_02012023_2200| 2 | 2 |
| 2_02012023_2300| 2 | 2 |
| 2_03012023_0000| 2 | 2 |
| 2_03012023_2200| 2 | 3 |
| 2_03012023_2300| 2 | 3 |
| 2_04012023_0000| 2 | 3 |

#Code to create basic data frame of Site
site <- c(rep(1,times=6), rep(2,times=9))
df <- data.frame(site)

我的主要问题是在重新启动序列之前数字序列的长度会变化(iidoEe.每个站点的记录数量不同)。如果给定站点的行数相同,我可以使用以下方法。

library("dplyr")
library("data.table")

# Create data frame of the site vector, with the number of observations per site of equal length
site <- c(rep(1,times=6), rep(2,times=6))
df <- data.frame(site)
# Create sequence with repeated numbers 
group_by(df,site) %>% mutate(night = rep(c(1:3), each=3))

但是我需要一个函数,它允许我根据分组向量的长度而不是定义的长度创建一个具有重复数字的序列。我试图找到一种将rep()与seq_沿着()或rowid()结合起来的方法,但没有成功。

wgx48brx

wgx48brx1#

您可以使用rep()length.out参数。关于docs
length.out:非负整数。输出向量的所需长度。其他输入将被强制转换为一个双向量,并取第一个元素。如果NA或无效,则忽略。
分组向量的长度可以用dplyr::n()计算。

library(dplyr)

df |>
    mutate(night = rep(seq_len(n()), each = 3, length.out = n()), .by = site)
#    site night
# 1     1     1
# 2     1     1
# 3     1     1
# 4     1     2
# 5     1     2
# 6     1     2
# 7     2     1
# 8     2     1
# 9     2     1
# 10    2     2
# 11    2     2
# 12    2     2
# 13    2     3
# 14    2     3
# 15    2     3

此外,由于您在问题中包含了library(data.table),如果dfdata.table,则可以使用相同的方法处理data.table语法,使用.N而不是n()

df[, night := rep(seq_len(.N), each = 3, length.out = .N), site]

相关问题