【问题标题】:Add group to data frame using monotonically increasing numbers使用单调递增的数字将组添加到数据框
【发布时间】:2020-10-15 09:35:47
【问题描述】:

我有一个看起来像这样的数据框(实际数据要大得多,也更复杂):

df.test = data.frame(
  sample = c("a","a","a","a","a","a","b","b"),
  day = c(0,1,2,0,1,3,0,2),
  value = rnorm(8)
)

  sample day       value
1      a   0 -1.11182146
2      a   1  0.65679637
3      a   2  0.03652325
4      a   0 -0.95351736
5      a   1  0.16094840
6      a   3  0.06829702
7      b   0  0.33705141
8      b   2  0.24579603

数据框由实验组织,但缺少实验 ID。相同的样本可以用于不同的实验,但我知道在单个实验中,天数从 0 开始,并且单调递增。

如何添加可以是数字 {1, 2, ...} 的实验 ID?

所以结果数据框将是

  sample day       value  exp
1      a   0 -1.11182146    1
2      a   1  0.65679637    1
3      a   2  0.03652325    1
4      a   0 -0.95351736    2
5      a   1  0.16094840    2
6      a   3  0.06829702    2
7      b   0  0.33705141    3
8      b   2  0.24579603    3

如果有任何帮助,我将不胜感激,尤其是使用 tidy/dplyr 解决方案。

【问题讨论】:

  • 我知道cumsum,但是在这里如何应用呢?还在想。
  • df.test %>% mutate(exp= 1 + cumsum(day - lag(day, default = 0) < 0)) 这样的东西对你有用吗?
  • cumsum(df.test$day == 0) 我假设 - 我怀疑某处有重复,但我正在吃午饭。
  • @Z.Lin:看起来很棒,正是我需要的。谢谢!请提交作为答案。

标签: r dataframe dplyr grouping


【解决方案1】:

如 cmets 所示,您可以使用 cumsum 执行此操作:

df.test %>% mutate(exp = cumsum(day == 0))
##   sample day       value exp
## 1      a   0  0.09300394   1
## 2      a   1  0.85322925   1
## 3      a   2 -0.25167313   1
## 4      a   0 -0.14811243   2
## 5      a   1 -1.86789014   2
## 6      a   3  0.45983987   2
## 7      b   0  2.81199150   3
## 8      b   2  0.31951634   3

【讨论】:

  • 哇,更简单。谢谢
  • 我也喜欢另一种解决方案,因为实验的第一天不需要为 0,只需小于最后一天。
  • @yuk,在这种情况下,您希望它从零开始吗?还是 1 点?
  • 我的意思是理论上有可能在一些实验中遗漏了0,所以他们可以从另一个数字开始。我只是还没有观察到。不想让问题复杂化。
【解决方案2】:

你可以使用diff

library(dplyr)
df.test %>% mutate(exp = cumsum(c(TRUE, diff(day) < 0)))

#  sample day      value exp
#1      a   0 -0.3382010   1
#2      a   1  2.2241041   1
#3      a   2  2.2202612   1
#4      a   0  1.0359635   2
#5      a   1  0.4134727   2
#6      a   3  1.0144439   2
#7      b   0 -0.1292119   3
#8      b   2 -0.1191505   3

【讨论】:

    猜你喜欢
    • 2011-11-12
    • 1970-01-01
    • 1970-01-01
    • 2022-07-05
    • 1970-01-01
    • 2021-08-07
    • 2017-02-23
    • 2013-08-18
    • 1970-01-01
    相关资源
    最近更新 更多