按时间顺序拆分数据框

时间:2015-10-21 08:57:19

标签: r

> head(data,25)
  Z     Time
1   682 14:33:40
2    -2 14:33:40
3  -172 14:33:40
4  -300 14:33:40
5  -331 14:33:40
6  -172 14:33:40
7   414 14:33:41
8  1028 14:33:41
9   871 14:33:41
10  407 14:33:41
11 -215 14:33:41
12 -527 14:33:41
13 -134 14:33:41
14  -77 14:33:41
15 -165 14:33:41
16  473 14:33:41
17 1089 14:33:41
18  808 14:33:41
19  -31 14:33:42
20 -488 14:33:42
21 -408 14:33:42
22 -268 14:33:42
23 -172 14:33:42
24  -79 14:33:42
25  310 14:33:42

df_list <- split(data, as.factor(data$Time))
 for (i in seq_along(df_list)) {
 filename = paste(i, ".csv")
  write.csv(df_list[[i]], filename)
}

我已经使用此代码为每秒数据创建.csv文件(数据$ Time)。我的数据从14:33:40开始,到14:38:40(5分钟)结束。这段代码运行良好,给我301文件,从13:33:40开始(6行数据)和13:33:41(12行数据),13:33:42(12行数据),现在,我想做的,无法解决的问题是,每2秒连续数据创建一个.csv文件。所以第一个.csv将是13:33:40&amp; 13:33:41,第二个.csv将是13:33:42&amp; 13:33:43等我试图找到按顺序使用拆分功能的解决方案(每2秒)或按顺序粘贴数据帧(当前每秒拆分)(但是2)但是卡住了。任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:0)

假设您的Time列具有您可以获得的所有可能值以及它们的订购,您可以使用以下方法。 我创建了自己的简单示例:

dt = read.table(text = 
                  "  Z     Time
                1   682 14:33:40
                2    -2 14:33:40
                3   414 14:33:41
                4  1028 14:33:41
                5   871 14:33:42
                6   407 14:33:42
                7  -215 14:33:43
                8  -527 14:33:43", header=T)

dt

#      Z     Time
# 1  682 14:33:40
# 2   -2 14:33:40
# 3  414 14:33:41
# 4 1028 14:33:41
# 5  871 14:33:42
# 6  407 14:33:42
# 7 -215 14:33:43
# 8 -527 14:33:43


# add a time id column
dt$Time_id = as.numeric(dt$Time)

dt

#      Z     Time Time_id
# 1  682 14:33:40       1
# 2   -2 14:33:40       1
# 3  414 14:33:41       2
# 4 1028 14:33:41       2
# 5  871 14:33:42       3
# 6  407 14:33:42       3
# 7 -215 14:33:43       4
# 8 -527 14:33:43       4


# flag every 2 values (as you want to group 2 consecutive values each time)
breaks = seq(min(dt$Time_id),max(dt$Time_id), 2)

# look up table to help you with grouping Time values
dt2 = data.frame(Time_id = unique(dt$Time_id))
dt2$flag = ifelse(dt2$Time_id %in% breaks, 1, 0)
dt2$group = cumsum(dt2$flag)

dt2

#   Time_id flag group
# 1       1    1     1
# 2       2    0     1
# 3       3    1     2
# 4       4    0     2


# join grouping info
dt3 = merge(dt,dt2,by="Time_id")

dt3

#   Time_id    Z     Time flag group
# 1       1  682 14:33:40    1     1
# 2       1   -2 14:33:40    1     1
# 3       2  414 14:33:41    0     1
# 4       2 1028 14:33:41    0     1
# 5       3  871 14:33:42    1     2
# 6       3  407 14:33:42    1     2
# 7       4 -215 14:33:43    0     2
# 8       4 -527 14:33:43    0     2


df_list <- split(dt3, as.factor(dt3$group))
for (i in seq_along(df_list)) {
  filename = paste(i, ".csv")
  write.csv(df_list[[i]], filename)
}

如果您发现任何错误等,请告诉我它是否适用