将具有多个观察值的行创建为列

时间:2013-11-28 18:10:01

标签: r reshape reshape2

我正在查看类似的问题,但我找不到类似于我的案例。我有一个数据框,每个主题,每个条件有多个观察。它看起来像这样:

subject   <- c(rep("S1",4), rep("S2",4))
condition <- rep(c(rep("a",2), rep("b",2)),2)
value     <- c(1:8)
df        <- data.frame(subject,condition,value)

df
  subject condition value
  S1         a     1
  S1         a     2
  S1         b     3
  S1         b     4
  S2         a     5
  S2         a     6
  S2         b     7
  S2         b     8

我想重塑它看起来像这样:

  subject condition.a condition.b
  S1           1           3
  S1           2           4
  S2           5           7
  S2           6           8

我已尝试reshapecast,但他们给我一条错误消息,因为每个主题和条件都有多个观察结果。有没有人建议如何做到这一点?

谢谢!

1 个答案:

答案 0 :(得分:1)

从某种意义上说,ab的哪些值应该相互耦合,这个问题有点含糊不清。

假设您希望(S1a)的第一个值与第一个(S2b)等结合,那么您可以添加一个虚拟count列,用于计算各种出现次数 (subjectcondition),然后使用count_idmeltdcast这样的数据:

library(plyr)
library(reshape2)

subject   <- c(rep("S1",4), rep("S2",4))
condition <- rep(c(rep("a",2), rep("b",2)),2)
value     <- c(1:8)
df        <- data.frame(subject,condition,value)

df.2 <- ddply(df, .(subject, condition), function(x) { x$count <- 1:nrow(x); x })
df.2
#   subject condition value count
# 1      S1         a     1     1
# 2      S1         a     2     2
# 3      S1         b     3     1
# 4      S1         b     4     2
# 5      S2         a     5     1
# 6      S2         a     6     2
# 7      S2         b     7     1
# 8      S2         b     8     2

df.3 <- melt(df.2, id.vars=c('subject', 'condition', 'count'))
dcast(df.3, subject + count ~ condition)
#   subject count a b
# 1      S1     1 1 3
# 2      S1     2 2 4
# 3      S2     1 5 7
# 4      S2     2 6 8

这是你想要的吗?