【问题标题】:Subtracting the first row from all following rows从所有后续行中减去第一行
【发布时间】:2017-09-28 11:19:13
【问题描述】:

从以下数据集中,我想从所有后续行(不管它们的标签)中减去标记为“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() 很容易进行子集化。

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

【问题讨论】:

  • 也许是apply(df, 2, function(x) c(x[1], x[-1] - x[1]))。 (未经测试。)
  • 类似df[] <- lapply(df, function(x) c(x[1], x[-1] - x[1])),但随后排除非数字变量。

标签: r dplyr


【解决方案1】:

如果我们需要从其他行中减去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 %>% mutate_if(is.numeric, funs(.-first(.))) 完美运行。
【解决方案2】:
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] 中,减去第一行repeated 到所需的行数(nrow(df) - 1)。

【讨论】:

  • 但是,library(tibbliverse)在哪里??
  • @DavidArenburg 我的tiblificationaholicinizer 今天不工作...卡在basement 中。请帮忙。
  • -1 因为你犯了罪。你应该向this user学习如何崇拜真正的tibbliverseLord。当你重新考虑你的行为后回来。
  • @DavidArenburg 我需要explain 给你:我的生活是一团complete。我深陷tribble。没有funs了。我应该fill我的半满杯吗?获取 unive..ehm..tidyverseglimpseseparate 来自我的妻子?好吧,no,我应该怎么explain给她?她会slice我。我应该join groups 的匿名tibliholics near 我的nest 吗?不,不适合我的group_sizenth时间,order_by次日午夜送达!为什么?! spread我的风险?我需要pull我自己,expand我的观点,然后继续前进-滚石gather没有苔藓!
  • mutated lead band_members?只是between 你和我,他们是all_equaldistinct 的功能是他们强迫性的关注with_order。对于summarize,这不是 case_when 我们unitearrange last 聚会。不,不要do它。
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 2019-07-24
    • 2014-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-23
    • 2018-03-07
    相关资源
    最近更新 更多