0

我有一个看起来像的数据框

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
4

3 回答 3

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
于 2012-07-25T17:29:07.250 回答
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
于 2012-07-25T17:21:16.200 回答
0

你可以使用 plyr:

library(plyr)
ddply(your_data, c("ID", "name"), 
      function(df){subset(df, series == "baseline", select = "MAP")-  
        subset(df, series == "next", select = "MAP")})
于 2012-07-25T17:22:25.450 回答