【问题标题】:Make rows with multiple observations into columns将具有多个观察值的行变成列
【发布时间】:2013-11-28 18:10:00
【问题描述】:

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

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,但它们给了我一条错误消息,因为每个主题和条件都有多个观察结果。有人对他们将如何做到这一点有建议吗?

谢谢!

【问题讨论】:

    标签: r reshape reshape2


    【解决方案1】:

    这个问题有点模棱两可,因为不清楚ab 的哪些值应该相互耦合。

    假设您希望 (S1, a) 的第一个值与第一个 (S2, b) 耦合等等,那么您可以添加一个虚拟的 count 列的各种出现 (subject, condition) 然后使用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
    

    这是你想要的吗?

    【讨论】:

    • 是的,做到了!就我的目的而言,a 和 b 的什么值耦合在一起并不重要。谢谢!
    猜你喜欢
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-05
    • 1970-01-01
    • 2023-01-16
    相关资源
    最近更新 更多