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