我有一个数据框,假设它叫做my.data
1 Item A B C
2 AAE 7 1 37
3 CCC 7 0 38
4 PPI 10 1 35
我想在名为"AAE"
"AAA"
的{{1}}下面创建一行,"AAE" - "CCC" - "PPI"
,例如,对于列A
,我们有7-7-10 = -10
,用于列B
我们有1-0-1 = 0
等。为了澄清,我的数据集要大得多,“CCC”和“PPI”不直接在“AAE”下
我该怎么做?
答案 0 :(得分:3)
我可以使用Reduce
以递归方式应用-
来获取大部分内容
newrow <- c(Item="AAA", lapply(dat[dat$Item %in% c("AAE","CCC","PPI"),-1], Reduce, f=`-`))
rbind(dat[1,], newrow, dat[-1,])
# Item A B C
#2 AAE 7 1 37
#21 AAA -10 0 -36
#3 CCC 7 0 38
#4 PPI 10 1 35
答案 1 :(得分:3)
另一种选择是首先转换data.frame,进行正常变异,然后将其转置回来。
library(dplyr)
`row.names<-`(df[,-1], df[,1]) %>% t %>%
transform(AAA = AAE - CCC - PPI) %>%
t %>% data.frame
A B C
AAE 7 1 37
CCC 7 0 38
PPI 10 1 35
AAA -10 0 -36
答案 2 :(得分:0)
apply(my.data[,c("A","B","C")],2,function(x)Reduce("-",x))
A B C
-10 0 -36