我试图从数据集中删除一个主题,然后将它们与其他主题合并,以便可以将它们在每个时间点的值与其他所有人进行比较。
数据如下所示:
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)然后,我从数据中删除主题4,并尝试将它们合并回来,以便将它们与其他每个主题进行比较:
four <- subset(d, subject == 4)
d2 <- subset(d, subject != 4)我已经尝试过了,但问题是,每次合并它都会重复每秒4次:
merge(d2, four, by = "seconds")有没有一种方法可以精确地合并每个个体相对于主题4?
发布于 2018-11-09 04:59:44
代码中的问题来自这样一个事实,即只有subjects 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,因此merge的输出是正确的,即您期望得到一个空表。
如果更改顺序,则不会出现问题。
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只要有重复的值,它就会取第一个值。
https://stackoverflow.com/questions/53215899
复制相似问题