簡體   English   中英

從所有后續行中減去第一行

[英]Subtracting the first row from all following rows

從以下數據集中,我想從所有后續行(它們的標簽的片段)中減去標記為“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()rowwise() transmute()不需要保留舊值)但是在調用整行而不僅是某個變量時也失敗了。 在基本的RI中也嘗試過(並且失敗了)但是使用dplyr會更好,因為整個數據集可能存在多個這些部分,並且group_by()使用單獨的列很容易進行子集化。

如果你能給我一些建議或所需的代碼,我將非常高興。

如果我們需要從其他行中減去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])) )
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 )。

作為替代使用沒有包:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM