【问题标题】:How to draw specific time intervals of rows from a data frame?如何从数据框中绘制特定时间间隔的行?
【发布时间】:2019-04-14 08:58:08
【问题描述】:

我有一个包含 3523 个观测值和 92 个变量的数据框。

下面是具有 10 个观测值和 04:00-05:00 的数据框示例

     04:00 04:15 04:30 05:00 05:15 05:30
 1:     -     -     -     -     -     -
 2:     2     2     2     -     2     2
 3:     2     -     -     2     2     2
 4:     -     -     2     -     2     2
 5:     -     -     -     -     2     2
 6:     2     -     2     2     -     2
 7:     -     -     -     -     2     2
 8:     2     2     -     2     2     2
 9:     -     -     -     -     2     2
10:     2     2     -     2     2     2

.

这些列定义了从凌晨 4:00 到凌晨 4:00 的 24 小时时间(15 分钟间隔)。行定义观察次数。

每一行都包含值“-”和“2”。

我想提取以'2'开头的区间的开始和结束

例如2:04:00-04:30; 3:04:00; 05:00 4:04:30

我还想将输出保存在 excel 或 txt 文件中。你能帮帮我吗

【问题讨论】:

  • 不清楚,你如何计算n。间隔以2 开始,以2 结束,不管中间是否有-?行号对应于n(例如第2行-n == 2)?如果是这样,为什么要2: 04:15 - 04:30?不应该是2: 04:00 - 04:30吗?
  • 亲爱的@utubun 是的,你是对的 - 我纠正了错误 -> 你能帮我吗?
  • 我会尽力做到最好的,@Mate

标签: r function matrix return extract


【解决方案1】:

在与@Mate 讨论后,我对其进行了编辑(请参阅此答案的 cmets):

解决办法:

library(tidyverse) 

dat %>%
  rownames_to_column("n") %>%
  mutate(n = as.integer(n)) %>%
  gather(key = "time", value = "observation", -n) %>% 
  group_by(n) %>%
  filter(observation == "2") %>%
  summarize(
    interval = paste(time[seq(1, n(), 2)], 
                     c(time, "...")[seq(2, n() + n() %% 2, 2)], 
                     sep = "-",
                     collapse = ", ")
    ) %>%
  ungroup() %>%
  arrange(n) %>%
  write_csv("my_results.csv")

输出

# A tibble: 100 x 2
       n interval                                                                    
   <int> <chr>                                                                       
 1     1 04:30-14:00, 19:30-20:15, 22:30-01:15, 03:45-...                            
 2     2 06:15-08:00, 09:00-12:00, 13:45-16:30, 18:45-23:15, 00:30-02:15             
 3     3 06:00-06:30, 08:00-09:45, 11:15-13:30, 14:15-23:15, 01:00-01:30             
 4     4 20:00-21:15, 23:30-03:15                                                    
 5     5 05:00-09:30, 10:00-10:30, 11:45-12:00, 13:15-13:30, 14:00-20:15, 20:30-21:3~
 6     6 07:45-08:30, 09:15-13:15, 19:15-19:30, 20:30-20:45, 21:00-21:45, 01:45-...  
 7     7 09:30-17:45, 21:15-...                                                      
 8     8 07:00-09:30, 12:45-18:00, 19:00-21:15, 00:15-02:00                          
 9     9 05:45-06:15, 09:00-16:00, 17:15-19:45, 21:15-22:30, 23:00-...               
10    10 10:00-10:15, 12:15-13:30, 16:15-16:45, 21:30-23:45, 00:45-01:30  

数据

colnms <- paste(
  str_pad(rep(c(4:23, 0:3), each = 4), 2, "left", 0),
  str_pad(rep(c(0, 15, 30, 45), times = 24), 2, "left", 0),
  sep = ":"
)

set.seed(53248604)
dat <- matrix(sample(c("-", 2), 9600, prob = c(0.9, 0.1), replace = T), nrow = 100)

dimnames(dat) <- list(1:100, colnms)

dat <- as.data.frame(dat)

【讨论】:

  • 亲爱的@utubun 你太棒了!但是我有一个很大的要求要你如何挖掘以 2 开头和结尾的间隔。例如示例 3 它将是 04:00 和 05:00?谢谢
  • 你的意思是不计算@jay.sf 完成的n('2') == 1 的间隔吗?顺便说一句,看看@jay.sf 的答案,我们都可以从中学到很多东西。
  • 亲爱的@utubun 我的意思是计算间隔不仅仅是第一个和最后一个'2';还有“空格”或在此之间产生这种情况的间隔。例如,假设表格从 07:15 到 10:30 有“2”,那么在 11:00 有一个“-”,还有一个“2”到 11:45 的间隔,而不是“-”,在12:30 开始另一个“2”间隔直到 14:45 这我不明白如何编码..你能帮我吗?
  • 好吧,让我想想
  • 为迟到的回复道歉;是的,您需要返回所有 2;所以 07:15-10:30、11:00-11:45、12:30-14:45 和 22:45-谢谢并道歉
【解决方案2】:

您可以像这样使用range()

fun <- function(dat) {
  L <- lapply(seq_along(dat), function(x, ...) {
    if (length(dat[x, dat[x, ] == 2, ]) >= 2) {
      range(names(dat[x, dat[x, ] == 2]))
    } else if (length(dat[x, dat[x, ] == 2, ]) == 1) {
      c(names(dat)[which(dat[x, ] == 2)], NA)
    }})
  setNames(data.frame(do.call(rbind, L)), c("t0", "t1"))
}

产量

> fun(df1)
     t0    t1
1 04:00 04:30
2 04:00 04:45
3 04:30  <NA>

数据

df1 <- setNames(data.frame(matrix(c(rep("-", 4), rep(2, 3), "-", 
                                    rep(c(2, rep("-", 2)), 2),2, rep("-", 25)), 
                                  ncol=4, byrow=TRUE)),
                strftime(as.POSIXct((0:3)*15*60 + 3*60*60, origin=Sys.Date() ), 
                         format="%H:%M"))

> df1
   04:00 04:15 04:30 04:45
1      -     -     -     -
2      2     2     2     -
3      2     -     -     2
4      -     -     2     -
5      -     -     -     -
6      -     -     -     -
7      -     -     -     -
8      -     -     -     -
9      -     -     -     -
10     -     -     -     -

【讨论】:

  • 很酷的答案,我在心里记下了你的方法。
猜你喜欢
  • 1970-01-01
  • 2021-01-19
  • 2014-02-09
  • 2022-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-27
  • 1970-01-01
相关资源
最近更新 更多