我的数据框看起来像
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
答案 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")})