我在描述我想要创建的内容时遇到了一些问题。所以,让我们说我有一个类似下面的数据集:
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)
但它并没有真正做到我想要的,虽然我觉得解决方案就在这附近。有什么建议?谢谢!
可重复的样本:
> dput(data)
structure(list(country = structure(c(1L, 1L, 1L, 1L, 1L, 2L,
2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L), .Label = c("A", "B", "C"), class = "factor"),
year = c(1990L, 1991L, 1992L, 1993L, 1994L, 1990L, 1991L,
1992L, 1993L, 1990L, 1991L, 1992L, 1993L, 1994L), X = c(0L,
1L, 2L, 3L, 3L, 1L, 2L, 3L, 3L, 0L, 1L, 2L, 3L, 4L)), .Names = c("country",
"year", "X"), class = "data.frame", row.names = c(NA, -14L))
答案 0 :(得分:3)
我们可以使用ave
base R
data$Xnew <- with(data, ave(X, country, FUN = function(x) c(TRUE, diff(x) !=0) & x!=0))
data$Xnew
#[1] 0 1 1 1 0 1 1 1 0 0 1 1 1 1
或data.table
library(data.table)
setDT(data)[, Xnew := as.integer((X - shift(X, fill=0)) >0) , by = country]
答案 1 :(得分:3)
您可以使用diff
来测试X是否更改
data$Xnew <- 0L
data$Xnew[which(diff(data$X) > 0) +1L] <- 1L
答案 2 :(得分:0)
这是使用动物园库的另一个选项(但比上面的更复杂)
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