R 查找同一列中符合特定条件的单元格之间的差异

R 查找同一列中符合特定条件的单元格之间的差异,r,R,我的数据框架如下: 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) 使用dplyr非常简单,并进行一些数学运算,以确保仅当前一周比当前行的周正好少1时,才会显示差异: library(dplyr) c <- c %&g

我的数据框架如下:

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)

使用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
库(dplyr)
c%
分组单位(名称)%>%
变异(df=c(0,差异(值))*as.numeric(c(0,差异(周))==1))
名称值周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

使用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
库(dplyr)
c%
分组单位(名称)%>%
变异(df=c(0,差异(值))*as.numeric(c(0,差异(周))==1))
名称值周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

命名您的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]

命名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]

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
库(data.table)

dat
数据。表
使用与临时集的联接将一周向前移动一步:

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
库(data.table)

dat WRT命名:
c
对于数据帧来说是一个糟糕的名称选择,因为
c
是一个非常常见的R函数。我还反对将
df
作为变量名,因为它通常被用作“数据帧”的缩写。我的建议是命名您的数据帧
df
和新列
diff
,但每个列都有自己的名称。@DanY-同意
c
,但
diff
也是一个常用函数!我无法反驳:)我想我只是想为colname挑选一些更具描述性的东西;显然,我的成功是微不足道的。WRT命名:
c
对于数据帧来说是一个糟糕的名称选择,因为
c
是一个非常常见的R函数。我还反对将
df
作为变量名,因为它通常被用作“数据帧”的缩写。我的建议是命名您的数据帧
df
和新列
diff
,但每个列都有自己的名称。@DanY-同意
c
,但
diff
也是一个常用函数!我无法反驳:)我想我只是想为colname挑选一些更具描述性的东西;很明显,我的成功是微不足道的。非常感谢,就是这样。非常感谢,就是这样。