r - 在 R 数据表中查找字符串的第一次迭代

标签 r datatable

我对 R 还很陌生,所以我试图弄清楚如何才能做得更好。我有一个由两列组成的数据表(日和 sleep 状态)。我怎样才能根据列日找到 sleep 和清醒的第一次迭代,并改变另一列以指示人何时开始 sleep (第一行 sleep )和停止 sleep (第一行清醒)。其余 sleep 时间,该栏应显示 N.A.

<表类=“s-表”> <标题> 日 sleep 状态 <正文> 1 sleep 1 sleep 1 sleep 1 醒来 2 sleep 2 sleep 2 sleep 2 醒来

期望的输出

<表类=“s-表”> <标题> 日 sleep 状态 最终状态 <正文> 1 sleep 开始 sleep 1 sleep 不适用 1 sleep 停止 sleep 1 醒来 不适用 2 sleep 开始 sleep 2 sleep 不适用 2 sleep 停止 sleep 2 醒来 不适用

最佳答案

这是一种潜在的解决方案:

library(data.table)

dt <- data.table::data.table(
          Day = c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L),
  SleepStatus = c("Sleeping","Sleeping","Sleeping",
                  "Awake","Sleeping","Sleeping","Sleeping","Awake")
)

dt[, `Final Status` := {ifelse(
  cumsum(SleepStatus != "Sleeping") != shift(cumsum(SleepStatus != "Sleeping"), fill = 0, type = "lag"),
  "Stop Sleep", "Start Sleep")}]
dt[, `Final Status` := {ifelse(
  `Final Status` == shift(`Final Status`, fill = "NA", type = "lag"),
  NA, `Final Status`)}]
dt
#>    Day SleepStatus Final Status
#> 1:   1    Sleeping  Start Sleep
#> 2:   1    Sleeping         <NA>
#> 3:   1    Sleeping         <NA>
#> 4:   1       Awake   Stop Sleep
#> 5:   2    Sleeping  Start Sleep
#> 6:   2    Sleeping         <NA>
#> 7:   2    Sleeping         <NA>
#> 8:   2       Awake   Stop Sleep

如果将代码分解成更小的 block ,它就会变得更有意义。我使用下面的 tidyverse 函数完成了此操作,因为我觉得它更容易理解,但如果您愿意,我可以将其更改为 data.table 语法。

library(data.table)

dt <- data.table::data.table(
          Day = c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L),
  SleepStatus = c("Sleeping","Sleeping","Sleeping",
                  "Awake","Sleeping","Sleeping","Sleeping","Awake")
)

library(tidyverse)
df <- as.data.frame(dt)

# When the Sleepstatus is not "Sleeping", increment the variable by one
df2 <- df %>%
  mutate(Sleeping = cumsum(SleepStatus != "Sleeping"))
df2
#>   Day SleepStatus Sleeping
#> 1   1    Sleeping        0
#> 2   1    Sleeping        0
#> 3   1    Sleeping        0
#> 4   1       Awake        1
#> 5   2    Sleeping        1
#> 6   2    Sleeping        1
#> 7   2    Sleeping        1
#> 8   2       Awake        2

# If the previous value in "Sleeping" is different to the current value,
# add the "stop sleeping" flag (i.e. show when "Sleeping" changes)
df3 <- df2 %>%
  mutate(Sleep_label = ifelse(Sleeping != lag(Sleeping, default = 0), "Stop sleeping", "Start sleeping"))
df3
#>   Day SleepStatus Sleeping    Sleep_label
#> 1   1    Sleeping        0 Start sleeping
#> 2   1    Sleeping        0 Start sleeping
#> 3   1    Sleeping        0 Start sleeping
#> 4   1       Awake        1  Stop sleeping
#> 5   2    Sleeping        1 Start sleeping
#> 6   2    Sleeping        1 Start sleeping
#> 7   2    Sleeping        1 Start sleeping
#> 8   2       Awake        2  Stop sleeping

# Then, if the value in Sleep_label is equal to the previous label,
# change it to NA
df4 <- df3 %>%
  mutate(Final_status = ifelse(Sleep_label == lag(Sleep_label, default = "NA"), NA, Sleep_label))
df4
#>   Day SleepStatus Sleeping    Sleep_label   Final_status
#> 1   1    Sleeping        0 Start sleeping Start sleeping
#> 2   1    Sleeping        0 Start sleeping           <NA>
#> 3   1    Sleeping        0 Start sleeping           <NA>
#> 4   1       Awake        1  Stop sleeping  Stop sleeping
#> 5   2    Sleeping        1 Start sleeping Start sleeping
#> 6   2    Sleeping        1 Start sleeping           <NA>
#> 7   2    Sleeping        1 Start sleeping           <NA>
#> 8   2       Awake        2  Stop sleeping  Stop sleeping

reprex package 于 2022 年 5 月 20 日创建(v2.0.1)

这有道理吗?或者我只是让事情变得更加困惑?

关于r - 在 R 数据表中查找字符串的第一次迭代,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72312837/

相关文章:

python - 如何在 Python 上使用 PMML 文件和 Augustus 对线性模型进行评分

C# DataTable 选择列名类似的列

使用 D3.js 时 DataTables 中的 Javascript 错误

c# - WPF 应用程序将数据表写入 Excel 的更有效方法?

r - R 中的转换日期正在更改为 future 日期,而不是过去日期

按值对 geom_bar ggplot2 中的条形图重新排序

javascript - 如何在数据表中添加行?

C# - 更改 DataGridView 中每行单元格值的最有效方法

R:knn + pca,选择未定义的列

r - OpenBUGS 无法收敛于 WinBUGS 中收敛的模型。精度极限?