【发布时间】:2021-01-25 08:04:09
【问题描述】:
我有一个由三列组成的数据框:x、ID 和 date_time。 “x”列是变量 x 的记录,ID 表示正在记录的内容,而 date_time 表示何时记录。请参阅下面的数据框。
我想从这个数据帧计算一个新的数据帧,它有七列:“Measurement”、“ID”和“Date”、“x_4_10_day”、“Day_total”、“x_4_10_night”、“Night_total”。
- “测量”。此列应说明这是给定 ID 的数字测量值。测量从 23:00:00 开始,然后一直运行到第二天的 22:59:59。然而,测量在随机时间开始,因此第一次测量的持续时间不是 24 小时。最后一次测量也不是 24 小时。
- “身份证”。指明给定测量的 ID
- “日期”。此列应显示给定测量中最后一次记录的日期,格式为:yyyy.mm.dd。
- “x_4_10_day”:测量分为一天(7:00:00-22:59:59)和夜晚(23:00:00-6:59:59)。此列应指示在给定测量中每天 x 已在 4-10(均包括在内)之间的总时间量(以分钟为单位)。 x 在 4-10 之间的记录可以视为 x 在 4-10 之间持续 5 分钟,因为每次记录之间有 5 分钟。
- “Day_total”:此列应表示一天中测量的总时间(以分钟为单位)x。 x 中存在应减去的缺失值。 x 的缺失值留空。对于每个缺失的测量,应从总时间中减去 5 分钟。此外,一些测量在 7:00 之后开始。
- “x_4_10_night”:此列应表示在给定测量中每晚 x 的总时间(以分钟为单位)在 4 到 10 之间(均包括在内)。
- “Night_total”:此列应指示在一个晚上测量的总时间量(以分钟为单位)x。 x 中存在应减去的缺失值。 x 的缺失值留空。对于每个缺失的测量,应从总时间中减去 5 分钟。
每个唯一测量值都应该有一行。到目前为止,我有一个代码可以正确返回列:“Measurement”、“ID”和“Date”:
df1$mydate = as.Date(df1$date_time, format = "%Y.%m.%d %H:%M:%S")
df1$tm <- as.numeric(df1$date_time)
df1$dts <- 86400*as.numeric(df1$mydate)
df2 <- df1 %>%
group_by(ID,mydate) %>%
transform(date = case_when(((dts-3600)<tm & tm<(dts+82800)) ~paste0(mydate), ((dts+82800)<=tm) ~paste0(mydate+1) )) %>%
select(ID,date) %>%
unique() %>%
group_by(ID) %>%
mutate(measurement = row_number())
但是我不知道怎么做最后一个。
这是一个预期的输出:
dummy_output <- read.table(header=TRUE, text ="
ID Date Measurement x_4_10_day Day_total x_4_10_night Night_total
12 2020.03.02 1 30 40 0 0
12 2020.03.03 2 0 0 45 75
13 2020.05.09 1 90 90 0 0
")
非常感谢任何建议,谢谢!
这是数据:
structure(list(date_time = c("2020.03.02 22:00:17", "2020.03.02 22:05:17",
"2020.03.02 22:10:17", "2020.03.02 22:35:17", "2020.03.02 22:40:17",
"2020.03.02 22:45:17", "2020.03.02 22:50:17", "2020.03.02 22:55:17",
"2020.03.02 23:00:17", "2020.03.02 23:05:17", "2020.03.02 23:10:17",
"2020.03.02 23:15:17", "2020.03.02 23:20:17", "2020.03.02 23:25:17",
"2020.03.02 23:30:17", "2020.03.02 23:35:17", "2020.03.02 23:40:17",
"2020.03.02 23:45:17", "2020.03.02 23:50:17", "2020.03.02 23:55:17",
"2020.03.03 00:00:17", "2020.03.03 00:55:17", "2020.03.03 01:00:17",
"2020.03.03 01:05:17", "2020.03.03 01:10:17", "2020.03.03 01:15:17",
"2020.03.03 01:20:17", "2020.03.03 01:25:17", "2020.05.09 08:39:32",
"2020.05.09 08:39:32", "2020.05.09 08:39:32", "2020.05.09 08:39:32",
"2020.05.09 08:39:32", "2020.05.09 08:39:32", "2020.05.09 08:39:32",
"2020.05.09 08:39:32", "2020.05.09 08:39:32", "2020.05.09 08:39:32",
"2020.05.09 08:39:32", "2020.05.09 08:39:32", "2020.05.09 08:39:32",
"2020.05.09 08:39:32", "2020.05.09 08:39:32", "2020.05.09 08:39:32",
"2020.05.09 08:39:32", "2020.05.09 08:39:32"), id = c(12L, 12L,
12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L,
12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L,
13L, 13L, 13L, 13L, 13L, 13L, 13L, 13L, 13L, 13L, 13L, 13L, 13L,
13L, 13L, 13L, 13L, 13L), x = c("7.55", "4.55", "4.55", "12",
"12", "10", "10", "4.3", "", "", "4.3", "4.3", "4.3", "", "4.3",
"12", "12", "12", "2", "12", "12", "", "8", "3", "3", "2", "2",
"", "12", "10", "10", "4.3", "4.3", "4.3", "4.3", "4.3", "4.3",
"4.3", "4.3", "12", "12", "12", "12", "12", "12", "12")), row.names = c(NA,
46L), class = "data.frame")
【问题讨论】:
-
是的,当然!感谢您让我知道我忘记了。
-
@Magnus,通过提供的示例数据,我无法理解
x是什么? -
所以!你的意思是你的第4列会有第一个值和最后一个值的时间差,以分钟为单位,基于两个条件1.给定值之间的X和2.时间应该是一天?我说的对吗?
-
另外,col x 中的缺失值是什么意思?你的意思是
NA? -
再告诉我一件事,你能
x在任何一个白天/晚上不止一次地在 4 到 10 之间变化吗?就像它可能超过 10 然后回到范围内,并且可能再次增加或减少超出限制。