R 如何创建一个只捕获增长的变量?

R 如何创建一个只捕获增长的变量?,r,function,R,Function,我在描述我想要创建的内容时遇到一些问题。假设我有一个数据集,如下所示: country year X A 1990 0 A 1991 1 A 1992 2 A 1993 3 A 1994 3 B 1990 1 B 1991 2 B 1992 3 B 1993 3 C 1990 0 C 1991

我在描述我想要创建的内容时遇到一些问题。假设我有一个数据集,如下所示:

country year    X
A       1990    0
A       1991    1
A       1992    2
A       1993    3
A       1994    3
B       1990    1
B       1991    2
B       1992    3
B       1993    3
C       1990    0
C       1991    1
C       1992    2
C       1993    3
C       1994    4
变量X统计一个国家在媒体上出现的次数。请注意,虽然它有时会在几年内保持在同一个数字上,但这是因为该年没有新出现的报告

所以我想创建一个只捕获增长的变量。让我们把这个变量称为Xnew。下面我举一个例子来说明它的样子:

country year    X   Xnew
A       1990    0   0
A       1991    1   1
A       1992    2   1
A       1993    3   1
A       1994    3   0
B       1990    1   1
B       1991    2   1
B       1992    3   1
B       1993    3   0
C       1990    0   0
C       1991    1   1
C       1992    2   1
C       1993    3   1
C       1994    4   1
正如您所看到的,Xnew变量是一个二进制变量,其中1只捕获增加值,0则捕获其他值

我创建此变量的尝试如下:

> data$Xnew <- as.numeric(X >1)
我们可以从R基使用ave

我们可以从R基使用ave


这里有另一个使用zoo库的选项,但比上面的选项更复杂

library(zoo); library(dplyr)

tmp=tbl_df(data.frame())
for(s in unique(data$country)) {
  #s="A"
  t=filter(data, country==s)
  t=t[order(as.Date(t$year)),]
  if(nrow(t)==1){
    t$Xnew[1]=0
  } else {
    t$previous = lag(zoo(t$X), 1, na.pad=TRUE)
    t$previous[is.na(t$previous)]<- 0
    t$Xnew=t$X-t$previous
  }
  tmp=rbind(tmp, t)
}
tmp

这里有另一个使用zoo库的选项,但比上面的选项更复杂

library(zoo); library(dplyr)

tmp=tbl_df(data.frame())
for(s in unique(data$country)) {
  #s="A"
  t=filter(data, country==s)
  t=t[order(as.Date(t$year)),]
  if(nrow(t)==1){
    t$Xnew[1]=0
  } else {
    t$previous = lag(zoo(t$X), 1, na.pad=TRUE)
    t$previous[is.na(t$previous)]<- 0
    t$Xnew=t$X-t$previous
  }
  tmp=rbind(tmp, t)
}
tmp
您可以使用diff来测试X是否发生变化

data$Xnew <- 0L
data$Xnew[which(diff(data$X) > 0) +1L] <- 1L
您可以使用diff来测试X是否发生变化

data$Xnew <- 0L
data$Xnew[which(diff(data$X) > 0) +1L] <- 1L

图书馆DPLYR;数据%>%mutateXnew=as.integerc0,diffX>0librarydplyr;数据%>%mutateXnew=as.integerc0,diffX>0Hi-akrun。谢谢你!3天前我发布了另一个问题,如何创建一个变量来捕获某个阈值R下的增长?如果你有时间看一下,我会非常感激的。你似乎是解决这个问题的合适人选。如果你找不到,请告诉我。我找到了,我会查一查。谢谢你!3天前我发布了另一个问题,如何创建一个变量来捕获某个阈值R下的增长?如果你有时间看一下,我会非常感激的。你似乎是解决这个问题的合适人选。如果你找不到,请告诉我。我找到了,我会查一查
data$Xnew <- 0L
data$Xnew[which(diff(data$X) > 0) +1L] <- 1L