【发布时间】:2017-02-26 11:55:19
【问题描述】:
我有一个数据框,其中列出了观察到的行为(“观察”)、观察到的对象(“代码”)和观察时间(“天”和“时间”):
code day time observation
A1 1 07:30:00 w
A1 1 12:15:00 f
A1 1 18:40:00 v
B2 1 08:12:00 q
B2 1 09:33:00 s
B2 2 14:10:00 a
B2 2 20:20:00 g
根据这些数据,我想创建一个新的数据框,其中每个观察结果都与单个主题内的后续观察结果配对。对于示例数据,生成的新数据框应如下所示:
code night obs.1 obs.2
A1 FALSE w f
A1 FALSE f v
B2 FALSE q s
B2 TRUE s a
B2 FALSE a g
新变量“夜”表示两次观察之间是否有一个夜晚,即第二次观察是否在第二天进行。 (请注意,不是一个主题的第一个或最后一个观察值如何在新数据框中出现 两次,因为它既是一个观察值中的前一个观察值,也是另一个两个观察值系列中的下一个观察值.)
我想编写一个循环,逐行遍历原始数据帧,然后查看下一行并比较“代码”和“日期”,然后在代码相同时创建一个新行,并且当“day”改变时,将“night”设置为“TRUE”。类似于下面示例数据中的代码。
有没有比循环遍历数据更好的方法?
例如,是否可以通过reshape() 之类的方式来实现?
样本数据
dat <- read.table(textConnection("
code day time observation
A1 1 07:30:00 w
B2 2 14:10:00 a
A1 1 12:15:00 f
A1 1 18:40:00 v
B2 1 08:12:00 q
B2 1 09:33:00 s
B2 2 20:20:00 g
"), header = TRUE, as.is = TRUE)
dat$code <- as.factor(dat$code)
dat$day <- as.factor(dat$day)
dat$time <- strptime(dat$time, "%T")
dat <- dat[with(dat, order(code, day, time)), ] # so we can loop
dat.pairs <- data.frame(
code = character(),
night = logical(),
obs.1 = character(),
obs.2 = character(),
stringsAsFactors = FALSE
)
for (i in 1:(nrow(dat)-1)) {
if (dat[i, ]$code == dat[i+1, ]$code) {
if (dat[i, ]$day == dat[i+1, ]$day) {
n = FALSE
} else {
n = TRUE
}
dat.pairs <- rbind(dat.pairs, data.frame(code = dat[i, ]$code, night = n, obs.1 = dat[i, ]$observation, obs.2 = dat[i+1, ]$observation))
}
}
【问题讨论】: