采用此数据框......
df <- data.frame(cat = rep(c('cat1','cat2','cat3'),each=3),
subcat = rep(c('a','b','c'),3),
y1 = c(rep(10,3),rep(1,6)),
y2 = c(rep(10,3),1:6))
df:
cat subcat y1 y2
cat1 a 10 10
cat1 b 10 10
cat1 c 10 10
cat2 a 1 1
cat2 b 1 2
cat2 c 1 3
cat3 a 1 4
cat3 b 1 5
cat3 c 1 6
我想从cat1中减去cat2和cat3 ...并调用结果cat类似new.cat1。我正在寻找的结果应该是一个看起来像这样的数据框(或者它可以简单地附加到df。)
cat subcat y1 y2
new.cat1 a 8 5
new.cat1 b 8 3
new.cat1 c 8 1
在这个例子中,我只有一个子类别,但我正在寻找一种可能有多个子类别的方法。有什么帮助吗?
答案 0 :(得分:1)
您可以使用以下公式尝试aggregate
。
df
## cat subcat y1 y2
## 1 cat1 a 10 10
## 2 cat1 b 10 10
## 3 cat1 c 10 10
## 4 cat2 a 1 1
## 5 cat2 b 1 2
## 6 cat2 c 1 3
## 7 cat3 a 1 4
## 8 cat3 b 1 5
## 9 cat3 c 1 6
res <- aggregate(formula = cbind(y1, y2) * ifelse(cat == "cat1", 1, -1) ~ subcat, data = df,
FUN = sum)
cbind(cat = "new.cat1", res)
## cat subcat y1 y2
## 1 new.cat1 a 8 5
## 2 new.cat1 b 8 3
## 3 new.cat1 c 8 1
答案 1 :(得分:0)
您可以使用plyr::ddply
。不确定如何将其附加到df
。
> library(plyr)
> ddp <- ddply(df, .(subcat), summarize,
y1 = sum(y1[1], -y1[2:3]), y2 = sum(y2[1], -y2[2:3]))
> cbind(cat = 'new.cat1', ddp)
# cat subcat y1 y2
# 1 new.cat1 a 8 5
# 2 new.cat1 b 8 3
# 3 new.cat1 c 8 1