我正在尝试从数据集中删除一个主题,然后将其与其他主题合并,以便可以将每个时间点的主题值与其他所有人进行比较。
这是数据的样子:
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准确地合并每个人?
答案 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
只要有重复项,它将采用第一个值。