Проблема в вашем коде связана с тем, что только у субъектов 4
есть значения, которые удовлетворяют seconds == 4
.См .:
subject <- rep(1:5, each = 20)
seconds <- rep(1:20, each = 20)
d <- data.frame(subject, seconds)
with(d, table(subject, seconds))
seconds
subject 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
1 20 0 0 0 0 20 0 0 0 0 20 0 0 0 0 20 0 0 0 0
2 0 20 0 0 0 0 20 0 0 0 0 20 0 0 0 0 20 0 0 0
3 0 0 20 0 0 0 0 20 0 0 0 0 20 0 0 0 0 20 0 0
4 0 0 0 20 0 0 0 0 20 0 0 0 0 20 0 0 0 0 20 0
5 0 0 0 0 20 0 0 0 0 20 0 0 0 0 20 0 0 0 0 20
Поскольку вы объединяете секунды, а для всех записей в four
количество секунд равно четырем, вывод слияния правильный, т.е. вы ожидаете пустую таблицу.
Если вы измените порядок, проблема не возникнет.
subject <- rep(1:20, each = 5)
seconds <- rep(1:20, each = 20)
d <- data.frame(subject, seconds)
four <- subset(d, subject == 4)
d2 <- subset(d, subject != 4)
newdf <- merge(d2, four, by = "seconds")
head(newdf)
seconds subject.x subject.y
1 1 1 4
2 1 1 4
3 1 1 4
4 1 1 4
5 1 1 4
6 1 1 4
Там, где вы видите, что теперь мы можем найти предметы по x и y, то есть левый и правый кадры данных, переданные merge
.
Комментарий: чтопосле вас звучит больше похоже на изменение ваших данных, но вам все равно нужно выяснить, что делать с вашими дубликатами.Чтобы дать вам представление:
library(reshape2)
d$ind <- factor(d$subject==4, labels = c("four", "not four"))
out <- dcast(d, seconds ~ ind, fun.aggregate = function(x) x[1], value.var = "variable")
head(out)
seconds four not four
1 1 20.836195 16.539739
2 2 15.923540 11.534704
3 3 1.250495 12.992153
4 4 25.127817 31.510210
5 5 8.990819 8.030607
6 6 21.783900 38.300430
Это будет первое значение, если есть дубликат.