如何创建一个只能捕获的变量?

时间:2016-06-28 19:26:14

标签: 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    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))

3 个答案:

答案 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