通过重塑来转换,连接和减少数据

时间:2012-07-25 17:04:42

标签: r reshape

我的数据框看起来像

MAP  name       series    ID
1.0  aspartame  baseline  902349
1.0  aspartame  baseline  82749
1.0  aspartame  baseline  928542
1.0  aspartame  next      928542
0.8  aspartame  next      82749
0.8  aspartame  next      902349

我想将这些数据加入ID并计算差异 在MAP分数中基线和下一个之间。所以这应该给予

diff name       ID
0.2  aspartame  902349
0.2  aspartame  82749
0.0  aspartame  928542

3 个答案:

答案 0 :(得分:2)

根据OP的要求:使用reshape(或更确切地说reshape2)的解决方案。

d <- read.table(text = "
MAP  name       series    ID
1.0  aspartame  baseline  902349
1.0  aspartame  baseline  82749
1.0  aspartame  baseline  928542
1.0  aspartame  next      928542
0.8  aspartame  next      82749
0.8  aspartame  next      902349", header = TRUE)

require(reshape2)

dcast(data = d, formula = ID  + name~ ., value.var = "MAP", 
      fun.aggregate = function(x) (x[1] - x[2]))

给出

      ID      name  NA
1  82749 aspartame 0.2
2 902349 aspartame 0.2
3 928542 aspartame 0.0

答案 1 :(得分:1)

这是基础R中的一种方式(假设您的data.frame名为df):

aggregate(list(MAP = df$MAP), 
          by=list(ID = df$ID, name = df$name), 
          function(x) x[1] - x[2])
#       ID      name MAP
# 1  82749 aspartame 0.2
# 2 902349 aspartame 0.2
# 3 928542 aspartame 0.0

答案 2 :(得分:0)

您可以使用plyr:

library(plyr)
ddply(your_data, c("ID", "name"), 
      function(df){subset(df, series == "baseline", select = "MAP")-  
        subset(df, series == "next", select = "MAP")})