【问题标题】:Find the difference between cells in the same column that match certain criteria查找同一列中符合特定条件的单元格之间的差异
【发布时间】:2018-09-10 22:58:46
【问题描述】:

我有下面的数据框:

name<-c("ab","ab","ab","ac","ac","ac","d","d","d")
value<-c(9,9,6,10,10,4,8,9,8)
week<-c(31,31,32,31,31,35,32,33,35)
c<-data.frame(name,value,week)

如果之前的week 存在,我想创建一个新列,其中包含每个name 的周值之间的差异。如果不是,将显示 0。对于下面的数据框,答案如下:

       name value week df
    1   ab     9   31  0
    2   ab     9   31  0
    3   ab     6   32 -3
    4   ac    10   31  0
    5   ac    10   31  0
    6   ac     4   35  0
    7    d     8   32  0
    8    d     9   33  1
    9    d     8   35  0

【问题讨论】:

  • WRT 命名:c 对于数据框来说是一个糟糕的名称选择,因为 c 是一个非常常见的 R 函数。我也反对将df 作为变量名,因为它通常用作表示“数据框”的简写。我的建议是将您的数据框命名为 df 和您的新列 diff,但要各自命名。
  • @DanY - 同意c,但diff 也是一个常用函数!
  • 我无法反驳 :) 我想我只是想为 colname 选择更具描述性的东西;显然我的成功是微不足道的。

标签: r


【解决方案1】:

使用 dplyr 很容易做到,并进行一些数学运算以确保仅当前一周恰好比当前行的周小 1 时才显示差异:

library(dplyr)

c <- c %>% 
  group_by(name) %>% 
  mutate(df = c(0, diff(value)) * as.numeric(c(0, diff(week)) == 1))

  name  value  week    df
  <fct> <dbl> <dbl> <dbl>
1 ab        9    31     0
2 ab        9    31     0
3 ab        6    32    -3
4 ac       10    31     0
5 ac       10    31     0
6 ac        4    35     0
7 d         8    32     0
8 d         9    33     1
9 d         8    35     0

【讨论】:

  • 非常感谢。
【解决方案2】:

命名您的 data.frame df 和您的新列 diff,这是使用 data.table 的一种方法:

library(data.table)
setDT(df)

df[ , diff := ifelse(week-shift(week)==1, value-shift(value), 0), by=name]
df[is.na(diff), diff := 0]

【讨论】:

    【解决方案3】:

    data.table 使用一个临时集合的连接将一周向前移动了一步:

    library(data.table)
    dat <- as.data.table(c)
    
    
    dat[
      unique(dat[,c(.SD,.(week1=week+1))]),
      on=c("name","week"="week1"),
      dfr := value-i.value
    ]
    
    dat
    #   name value week dfr
    #1:   ab     9   31  NA
    #2:   ab     9   31  NA
    #3:   ab     6   32  -3
    #4:   ac    10   31  NA
    #5:   ac    10   31  NA
    #6:   ac     4   35  NA
    #7:    d     8   32  NA
    #8:    d     9   33   1
    #9:    d     8   35  NA
    

    【讨论】:

      猜你喜欢
      • 2013-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-24
      • 1970-01-01
      • 1970-01-01
      • 2021-06-24
      相关资源
      最近更新 更多