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
解决此问题@好眼睛…是的,我应该说第四排。您的解决方案有效…谢谢传奇!在过去的几个星期里,你已经回答了我的几个问题,我非常感谢。注意。这是一个非常好的答案。这段代码确实有效,但我刚刚意识到我的示例