Объединить один предмет наблюдения со всеми другими - PullRequest
0 голосов
/ 08 ноября 2018

Я пытаюсь удалить субъект из набора данных, а затем объединить его с другими, чтобы их значения в каждый момент времени можно было сравнить со всеми остальными.

Вот как выглядят данные:

subject <- rep(1:5, each = 20)
seconds <- rep(1:20, times = 20)
variable <- rnorm(n = subject, mean = 20, sd = 10)
d <- data.frame(subject, seconds, variable)

Затем я удаляю четвертый предмет из данных и пытаюсь объединить их обратно, чтобы сравнить их с каждым другим предметом:

four <- subset(d, subject == 4)
d2 <- subset(d, subject != 4)

Я пробовал это, но проблема в том, что он повторяет каждую из секунд 4 раза для каждого слияния:

merge(d2, four, by = "seconds")

Есть ли способ получить точное слияние каждого индивида относительно субъекта 4?

1 Ответ

0 голосов
/ 08 ноября 2018

Проблема в вашем коде связана с тем, что только у субъектов 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

Это будет первое значение, если есть дубликат.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...