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.framedf
和您的新列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挑选一些更具描述性的东西;很明显,我的成功是微不足道的。非常感谢,就是这样。非常感谢,就是这样。