【问题标题】:Split Data frame based on row index根据行索引拆分数据框
【发布时间】:2018-08-14 07:04:34
【问题描述】:

我想通过循环遍历行和子集来拆分我的数据框

indices = (diff(Data$Time>1800))
for (i in 1:length(indices)){
if(indices[i]==TRUE){
##### I need a function to split data by row index
}}

我试过了

lst <- split(Data, as.factor(diff(Data$Time>1800)==TRUE))

但它只返回真实的行,但我想要的是在每次它面对真实时拆分。

这就是我所拥有的

    Time        temp
7/1/17 13:45:34  56
7/1/17 13:45:37  68
7/1/17 13:45:39  98
7/1/17 13:45:40  99
7/1/17 13:45:46  97
7/1/17 14:16:29  48
7/1/17 14:16:30  78
7/1/17 14:16:31  66
7/1/17 14:17:34  93
7/1/17 14:17:39  98
7/1/17 14:17:40  98
7/1/17 14:17:44  93
7/1/17 14:47:10  54
7/1/17 14:47:12  67
7/1/17 14:47:16  69
7/1/17 14:47:18  95
7/1/17 14:47:19  95
7/1/17 14:47:23  96
7/1/17 14:47:28  96
7/1/17 14:47:30  99

这就是我想要的

Time        temp
7/1/17 13:45:34  56
7/1/17 13:45:37  68
7/1/17 13:45:39  98
7/1/17 13:45:40  99
7/1/17 13:45:46  97

Time        temp
7/1/17 14:16:29  48
7/1/17 14:16:30  78
7/1/17 14:16:31  66
7/1/17 14:17:34  93
7/1/17 14:17:39  98
7/1/17 14:17:40  98
7/1/17 14:17:44  93

Time        temp
7/1/17 14:47:10  54
7/1/17 14:47:12  67
7/1/17 14:47:16  69
7/1/17 14:47:18  95
7/1/17 14:47:19  95
7/1/17 14:47:23  96
7/1/17 14:47:28  96
7/1/17 14:47:30  99

是否可以通过将这些索引存储在一个向量中然后根据该向量拆分数据帧来拆分我的数据,这意味着只要行号等于我们的值“i”就拆分该行的数据帧。以便拥有多个数据帧。

【问题讨论】:

标签: r dataframe split subset


【解决方案1】:

使用新数据集,看起来应该是 1700 而不是 1800

library(dplyr)
library(purrr)
library(lubridate)
Data %>% 
    mutate(Time = dmy_hms(Time), 
           grp = cumsum(Time - lag(Time, default = Time[1L])> 1700)) %>%
    split(.$grp) %>% 
    map(~ .x %>%
            select(-grp))
#$`0`
#                 Time temp
#1 2017-01-07 13:45:34   56
#2 2017-01-07 13:45:37   68
#3 2017-01-07 13:45:39   98
#4 2017-01-07 13:45:40   99
#5 2017-01-07 13:45:46   97

#$`1`
#                  Time temp
#6  2017-01-07 14:16:29   48
#7  2017-01-07 14:16:30   78
#8  2017-01-07 14:16:31   66
#9  2017-01-07 14:17:34   93
#10 2017-01-07 14:17:39   98
#11 2017-01-07 14:17:40   98
#12 2017-01-07 14:17:44   93

#$`2`
#                  Time temp
#13 2017-01-07 14:47:10   54
#14 2017-01-07 14:47:12   67
#15 2017-01-07 14:47:16   69
#16 2017-01-07 14:47:18   95
#17 2017-01-07 14:47:19   95
#18 2017-01-07 14:47:23   96
#19 2017-01-07 14:47:28   96
#20 2017-01-07 14:47:30   99

base R 的类似选项是

split(Data, cumsum(c(0, diff(as.POSIXct(Data$Time,
             format = "%d/%m/%y %H:%M:%S", tz = 'GMT'))) > 1700))

【讨论】:

  • 我试过了,但我有一个错误提示:Math.POSIXT(Data$Time) 中的错误:没有为 POSIXt 对象定义 cumsum
  • @Oumayma10 最好用dput 和预期的输出展示一个小的可重现示例。除了你,没有人知道你的数据
  • 我添加了图片,你能看一下吗
  • @Oumayma10 图像的问题是我们无法复制数据。请使用dput
  • 我添加了更多细节,请您查看一下。
猜你喜欢
  • 1970-01-01
  • 2018-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多