将一个主题的观察结果合并到所有其他观察结果中

时间:2018-11-08 20:48:22

标签: r merge

我正在尝试从数据集中删除一个主题,然后将其与其他主题合并,以便可以将每个时间点的主题值与其他所有人进行比较。

这是数据的样子:

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 :(得分:2)

您的代码中的问题来自于这样的事实,即仅主题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中的所有条目,秒数等于4,因此合并输出正确,即,您期望表为空。

如果更改顺序,则不会发生此问题。

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

只要有重复项,它将采用第一个值。

相关问题