我在Windows 10上使用R 3.5.0。
我有一个数据框,使用
library(openxls)
read.xls("....")
。它有10万行,部分看起来像
S.No Start.DateEnd.Date Generation unitout timediff
7850 42907.76 42907.77 436.158469 INSERVICE 15
7851 42907.77 42907.78 443.302793 INSERVICE 15
7852 42907.78 42907.79 437.728683 INSERVICE 15
7853 42907.79 42907.80 390.832887 INSERVICE 15
7854 42907.80 42907.81 338.917658 INSERVICE 15
7855 42907.81 42907.82 300.056018 INSERVICE 15
7856 42907.82 42907.83 266.430064 INSERVICE 15
7857 42907.83 42907.84 248.952525 INSERVICE 15
7858 42907.84 42907.85 212.913333 INSERVICE 15
7859 42907.85 42907.86 18.523060 INSERVICE 15
7860 42907.86 42907.88 1.355428 OUTOFSERVICE 15
7861 42907.88 42907.89 1.355428 OUTOFSERVICE 15
7862 42907.89 42907.90 1.355428 OUTOFSERVICE 15
7863 42907.90 42907.91 1.355428 OUTOFSERVICE 15
7864 42907.91 42907.92 1.355428 OUTOFSERVICE 15
7865 42907.92 42907.93 1.355428 OUTOFSERVICE 15
7866 42907.93 42907.94 1.355428 OUTOFSERVICE 15
7867 42907.94 42907.95 1.355428 OUTOFSERVICE 15
7868 42907.95 42907.96 1.355428 OUTOFSERVICE 15
7869 42907.96 42907.97 1.355428 OUTOFSERVICE 15
7870 42907.97 42907.98 1.355428 OUTOFSERVICE 15
我想总结一下,以给我一个形式为
的数据框1 DateTime1(42907.76) DateTime2(42907.86) INSERVICE TIMEDIFF
2 DateTime2(42907.86) DateTime3(42907.98) OUTOFSERVICE TIMEDIFF
3 DateTime3(42907.98) DateTime4(...) INSERVICE TIMEDIFF
状态每次从INSERVICE变为OUTOFSERVICE时,都会捕获开始日期和结束日期。 基本上,我想知道数据帧中从哪个日期和时间开始服务到哪个日期和时间停止服务。在上面的示例中,DateTime1将为42907.76,DateTime2将为42907.86,因为在此之后它将不再使用。同样,DateTime2为42907.86至42907.98。等等。
我尝试创建一个标志来解决它,但是我无法创建数据框,因此没有在此处附加代码。与使用在后端执行所有操作的程序包相比,我更喜欢使用具有良好逻辑的易于理解的解决方案。
P.S。另一个问题是Excel时间格式转换为标准%Y%m%D%H%M格式。我已经在SO上读取了多个线程,并尝试执行as.posixCT,as.date等。但是它更改为NA或引发错误。
答案 0 :(得分:0)
使用dplyr
我们创建一个unitout滞后,并使用它来创建一个ID,之后我们可以在该ID上进行分组
library(dplyr)
df$id <- cumsum(as.integer(df$unitout != lag(df$unitout, n = 1, default=1)))
df %>% group_by(id, unitout) %>% summarise("Start" = min(Start.Date), "End" = max(End.Date))
您可以通过以下方式转换日期:
as.Date(42907.76, origin = "1899-12-30")
as.Date(42907.76, origin = "1904-01-01")
数据:
df <- read_table(
"S.No Start.Date End.Date Generation unitout timediff
7850 42907.76 42907.77 436.158469 INSERVICE 15
7851 42907.77 42907.78 443.302793 INSERVICE 15
7852 42907.78 42907.79 437.728683 INSERVICE 15
7853 42907.79 42907.80 390.832887 INSERVICE 15
7854 42907.80 42907.81 338.917658 INSERVICE 15
7855 42907.81 42907.82 300.056018 INSERVICE 15
7856 42907.82 42907.83 266.430064 INSERVICE 15
7857 42907.83 42907.84 248.952525 INSERVICE 15
7858 42907.84 42907.85 212.913333 INSERVICE 15
7859 42907.85 42907.86 18.523060 INSERVICE 15
7860 42907.86 42907.88 1.355428 OUTOFSERVICE 15
7861 42907.88 42907.89 1.355428 OUTOFSERVICE 15
7862 42907.89 42907.90 1.355428 OUTOFSERVICE 15
7863 42907.90 42907.91 1.355428 OUTOFSERVICE 15
7864 42907.91 42907.92 1.355428 OUTOFSERVICE 15
7865 42907.92 42907.93 1.355428 OUTOFSERVICE 15
7866 42907.93 42907.94 1.355428 OUTOFSERVICE 15
7867 42907.94 42907.95 1.355428 OUTOFSERVICE 15
7868 42907.95 42907.96 1.355428 OUTOFSERVICE 15
7869 42907.96 42907.97 1.355428 OUTOFSERVICE 15
7870 42907.97 42907.98 1.355428 OUTOFSERVICE 15")