R 对嵌套组中的行进行计数

R 对嵌套组中的行进行计数,r,R,这是我先前提出的问题的延伸。不幸的是,我没有成功地修改以前的代码以适应这个新的需求 我有一个嵌套组设计的数据集,需要按顺序计算子组。下面的示例数据框说明了我的数据集的结构GROUP_LENGTH是同一组中的行数,请注意,这些组中的行是按顺序计数的(即,a1和c2多次出现)组长度按顺序对每个组长度中的行进行编号 我的问题出现在SEQ_SAMPLE中。我的当前代码为整个数据集的组顺序编号,但我需要代码在每个站点和示例中对组顺序编号(请参见结果数据帧) 我使用ave尝试了此代码的变体,但没有成功。我还

这是我先前提出的问题的延伸。不幸的是,我没有成功地修改以前的代码以适应这个新的需求

我有一个嵌套组设计的数据集,需要按顺序计算子组。下面的示例数据框说明了我的数据集的结构
GROUP_LENGTH
是同一
组中的行数
,请注意,这些组中的行是按顺序计数的(即,
a1
c2
多次出现)<代码>组长度按顺序对每个
组长度
中的行进行编号

我的问题出现在
SEQ_SAMPLE
中。我的当前代码为整个数据集的
顺序编号,但我需要代码在每个
站点
示例
中对
顺序编号(请参见
结果
数据帧)

我使用
ave
尝试了此代码的变体,但没有成功。我还了解了如何对循环使用
,但是如果可能的话,我更愿意避免这种情况,因为我有一个大的数据集。我也对所有解决方案持开放态度,但更喜欢
基本包
解决方案,因为我希望避免加载包。 提前感谢你的帮助

df <- read.table(text = "SITE   SAMPLE  TIME    GROUP
a   1   1   a1
a   1   2   a2
a   1   3   a2
a   1   4   a3
a   2   1   b1
a   2   2   b1
a   2   3   b1
a   2   4   b3
a   2   5   b3
a   2   6   b3
b   1   1   c1
b   1   2   c2
b   1   3   c3
b   1   4   c4
b   1   5   c4
b   2   1   d1
b   2   2   d2
b   2   3   d3
", header = TRUE)

result <- read.table(text = "SITE   SAMPLE  TIME    GROUP   GROUP_LENGTH    GROUP_SEQ   SEQ_SAMPLE
a   1   1   a1  1   1   1
a   1   2   a2  2   1   2
a   1   3   a2  2   2   2
a   1   4   a3  1   1   3
a   2   1   b1  3   1   1
a   2   2   b1  3   2   1
a   2   3   b1  3   3   1
a   2   4   b3  3   1   2
a   2   5   b3  3   2   2
a   2   6   b3  3   3   2
b   1   1   c1  1   1   1
b   1   2   c2  1   1   2
b   1   3   c3  1   1   3
b   1   4   c4  2   1   4
b   1   5   c4  2   2   4
b   2   1   d1  1   1   1
b   2   2   d2  1   2   2
b   2   3   d3  1   3   3
", header = TRUE)

# First two lines of the code work fine....but it is the last line where the bug lines...
df$GROUP_LENGTH = with(rle(paste(df$SAMPLE, df$GROUP)), rep(lengths, lengths))
df$GROUP_SEQ = sequence(rle(paste(df$SAMPLE, df$GROUP))$lengths)

df$SEQ_SAMPLE = with(rle(paste(df$SITE, df$SAMPLE, df$GROUP)), rep(seq_along(values),lengths))


df您可以使用
ave
并在每个
站点
样本
中为
创建唯一编号

df$SEQ_SAMPLE = with(df, as.integer(ave(GROUP, SITE, SAMPLE, 
               FUN = function(x) with(rle(x), rep(seq_along(values), lengths)))))


identical(df$SEQ_SAMPLE, result$SEQ_SAMPLE)
#[1] TRUE

您可以使用
ave
并在每个
站点和
样本中为
组创建唯一编号

df$SEQ_SAMPLE = with(df, as.integer(ave(GROUP, SITE, SAMPLE, 
               FUN = function(x) with(rle(x), rep(seq_along(values), lengths)))))


identical(df$SEQ_SAMPLE, result$SEQ_SAMPLE)
#[1] TRUE

tidyverse解决方案非常简单,因为它直接应用了dplyr中的三个基本功能

  • n()
    返回行数
  • row\u number()
    它经常对行进行编号
  • densite\u rank()
    为每个元素提供一个标识
库(dplyr)
df%%>%group_by(group)%%>%
变异(组长度=n(),
组顺序=行编号())%>%
分组依据(现场、样本)%>%
突变(序列样本=密集秩(组))%>%
解组()
#一个tibble:18x7
现场样本时间组长度组顺序样本
1A 11A1 11
2 a 1 2 a2 2 1 2
3 a 1 3 a2 2 2 2
4 a 1 4 a3 1 3
5 a 2 1 b1 3 1 1
6 a 2 b1 3 2 1
7 a 2 3 b1 3 1
8 a 2 4 b3 3 1 2
9A25B3322
10 a 2 6 b3 3 2
11 b 1 c1 1 1 1
12 b 1 2 c2 1 2
13 b 1 3 c3 1 1 3
14 b 1 4 c4 2 1 4
15 b 1 5 c4 2 4
16 b 2 1 d1 1 1
17B2D21112
18 b 2 3 d3 1 1 3

一个tidyverse解决方案,非常简单,因为它直接应用了dplyr中的三个基本功能

  • n()
    返回行数
  • row\u number()
    它经常对行进行编号
  • densite\u rank()
    为每个元素提供一个标识
库(dplyr)
df%%>%group_by(group)%%>%
变异(组长度=n(),
组顺序=行编号())%>%
分组依据(现场、样本)%>%
突变(序列样本=密集秩(组))%>%
解组()
#一个tibble:18x7
现场样本时间组长度组顺序样本
1A 11A1 11
2 a 1 2 a2 2 1 2
3 a 1 3 a2 2 2 2
4 a 1 4 a3 1 3
5 a 2 1 b1 3 1 1
6 a 2 b1 3 2 1
7 a 2 3 b1 3 1
8 a 2 4 b3 3 1 2
9A25B3322
10 a 2 6 b3 3 2
11 b 1 c1 1 1 1
12 b 1 2 c2 1 2
13 b 1 3 c3 1 1 3
14 b 1 4 c4 2 1 4
15 b 1 5 c4 2 4
16 b 2 1 d1 1 1
17B2D21112
18 b 2 3 d3 1 1 3

此代码确实有效,但我刚刚意识到,我的示例数据集缺少一个关键元素…在同一
站点
示例
中重复
。例如,如果我们将第3行(即“a3”)中的
替换为“a1”,则
SEQ_SAMPLE
将更改为1,并且应为3。如果需要的话,我可以回复这个问题,但我很乐意通过评论看到一个潜在的解决方案。在我的示例中不包含此关键细节的道歉。您是指第4行吗?我更新了答案以使用
rle
解决此问题@好眼睛…是的,我应该说第四排。您的解决方案有效…谢谢传奇!在过去的几个星期里,你已经回答了我的几个问题,我非常感谢。注意。这是一个非常好的答案。这段代码确实有效,但我刚刚意识到我的示例