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

Create sequence of repeated values, with length based on a vector

提问人:Stacey Harwood 提问时间:9/12/2023 最后编辑:MarkStacey Harwood 更新时间:9/12/2023 访问量:72

问:

如何用数字序列填充列“Night”,每个数字重复 3 次,并根据列“Site”重新开始序列?我创建了一个表格,显示我想要实现的目标。这是我问题的简化版本,我需要能够在更大的数据帧上使用代码。

表格图像

Site_date_time 网站 晚上
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)

我的主要问题是重新启动序列之前数字序列的长度不同(即每个站点的记录数不同)。 如果给定站点的行数相同,我可以使用以下内容。

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_along() 或 rowid() 相结合的方法,但没有运气。

r dplyr 序列 代表

评论


答:

3赞 SamR 9/12/2023 #1

您可以使用 的参数。从文档中:length.outrep()

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

此外,正如您在问题中包含的,如果 is a 您可以对语法使用相同的方法,使用 .N 而不是 :library(data.table)dfdata.tabledata.tablen()

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

评论

2赞 jblood94 9/12/2023
这不会给出正确的输出。例如,使用 ,它从序列完成之前开始。 应该工作。.N > 9df <- data.table(site = rep(1:2, c(6, 12)))1site = 2rep(1:.N, each...
1赞 SamR 9/12/2023
@jblood94 我从问题中的代码中认为编号应该重新开始,但是再看一下文本后,我认为您是对的。我已经更新了,谢谢。(注意:我通常更喜欢 0 时,而不是因为令人惊讶的行为。在这里,这不可能发生,或者不会有组,但无论如何我都会坚持下去,因为它是一种有用的启发式方法,使我不必过多地考虑边缘情况。seq_len(x)1:xx
0赞 Stacey Harwood 9/13/2023
谢谢你@SamR和@jblood94!我对使用 R 很陌生,花了大半天时间试图解决这个问题。非常感谢您的帮助!