从所有后续行中减去第一行

时间:2017-09-28 11:19:14

标签: r dplyr

从以下数据集中,我想减去标有" BLK"的行中的值。从所有后续行(他们的标签的关注)。

 label   Int_A Int_B Int_C
 BLK     10    20    30    
 SMP     12.5  22.5  35    
 STD     15    25    40    

期望的输出:

 label   Int_A Int_B Int_C 
 BLK     10    20    30    
 SMP     2.5   2.5   5    
 STD     5     5     10   

BLK行保持不变或将设置为零无关紧要。

不幸的是,我发现的所有答案都只考虑一个变量,而不是全部。我尝试使用dplyr包,尤其是rowwise()transmute()(不需要保留旧值)但是在调用整行而不仅仅是某个变量时也失败了。在基本R中我也尝试过(并且失败了)但是使用dplyr会更好,因为整个数据集可能存在多个这些部分,并且group_by()使用单独的列很容易进行子集化。

如果您能给我一些建议或所需的代码,我将非常高兴。

3 个答案:

答案 0 :(得分:4)

如果我们需要从其他行中减去first行,请使用mutate_at指定数字列的索引或mutate_if,然后从所有列中减去first元素列的元素

library(dplyr)
df1 %>% 
    mutate_at(2:4, funs(c(first(.), (. - first(.))[-1])) )

mutate_if

df1 %>%
    mutate_if(is.numeric, funs(c(first(.), (. - first(.))[-1])) )

答案 1 :(得分:3)

df[-1, -1] <- df[-1 , -1] - df[rep(1, nrow(df) - 1), -1]
df
#   label Int_A Int_B Int_C
# 1   BLK  10.0  20.0    30
# 2   SMP   2.5   2.5     5
# 3   STD   5.0   5.0    10

从相关的行和列df[-1 , -1]中,将第一行rep减去必要的行数(nrow(df) - 1)。

答案 2 :(得分:0)

作为不使用包裹的替代方案:

diff是一个像df一样大小的矩阵,第一行为0,其余的等于df中的第一行。然后简单地减去。

df <- mtcars

diff <- matrix(c(rep(0,ncol(df)),rep(as.numeric(df[1,]),nrow(df)-1)),nrow=nrow(df),ncol=ncol(df),byrow=T)

df - diff