首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将一个主题观察结果与所有其他主题观察结果合并

将一个主题观察结果与所有其他主题观察结果合并
EN

Stack Overflow用户
提问于 2018-11-09 04:48:22
回答 1查看 38关注 0票数 2

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

数据如下所示:

代码语言:javascript
复制
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,并尝试将它们合并回来,以便将它们与其他每个主题进行比较:

代码语言:javascript
复制
four <- subset(d, subject == 4)
d2 <- subset(d, subject != 4)

我已经尝试过了,但问题是,每次合并它都会重复每秒4次:

代码语言:javascript
复制
merge(d2, four, by = "seconds")

有没有一种方法可以精确地合并每个个体相对于主题4?

EN

回答 1

Stack Overflow用户

发布于 2018-11-09 04:59:44

代码中的问题来自这样一个事实,即只有subjects 4具有满足seconds == 4的值。请参见:

代码语言:javascript
复制
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的输出是正确的,即您期望得到一个空表。

如果更改顺序,则不会出现问题。

代码语言:javascript
复制
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的左右数据帧。

评论:你想要什么听起来更像是重塑你的数据,但你仍然需要弄清楚如何处理你的副本。给你一个概念:

代码语言:javascript
复制
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

只要有重复的值,它就会取第一个值。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53215899

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档