如何生成"范围" R中的变量?

时间:2016-07-14 19:50:39

标签: r function dataframe

我有一个看起来像这样的数据集:

    Subject Year    X
       A    1990    1
       A    1991    1
       A    1992    2
       A    1993    3
       A    1994    4
       A    1995    4
       B    1990    0
       B    1991    1
       B    1992    1
       B    1993    2
       C    1991    1
       C    1992    2
       C    1993    3
       C    1994    3
       D    1991    1
       D    1992    2
       D    1993    3
       D    1994    4
       D    1995    5
       D    1996    5
       D    1997    6

我想生成一个二进制(0/1)变量(让我们说变量A),表示每个主题的X变量已达到3(或1-3)的天气。如果X变量已达到4或更多,则A不应捕获它。

它应该是这样的:

Subject Year    X   A
   A    1990    1   0
   A    1991    1   0
   A    1992    2   0
   A    1993    3   0
   A    1994    4   0
   A    1995    4   0
   B    1990    0   0
   B    1991    1   0
   B    1992    1   0
   B    1993    2   0
   C    1991    1   1
   C    1992    2   1
   C    1993    3   1
   C    1994    3   1
   D    1991    1   0
   D    1992    2   0
   D    1993    3   0
   D    1994    4   0
   D    1995    5   0
   D    1996    5   0
   D    1997    6   0

我尝试了以下内容:mydata$A<- as.numeric(mydata$X %in% 1:3)但它并没有控制继续......

可重复的样本:

> dput(mydata)
structure(list(Subject = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 
2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 4L, 4L, 4L), .Label = c("A", 
"B", "C", "D"), class = "factor"), Year = c(1990L, 1991L, 1992L, 
1993L, 1994L, 1995L, 1990L, 1991L, 1992L, 1993L, 1991L, 1992L, 
1993L, 1994L, 1991L, 1992L, 1993L, 1994L, 1995L, 1996L, 1997L
), X = c(1L, 1L, 2L, 3L, 4L, 4L, 0L, 1L, 1L, 2L, 1L, 2L, 3L, 
3L, 1L, 2L, 3L, 4L, 5L, 5L, 6L)), .Names = c("Subject", "Year", 
"X"), class = "data.frame", row.names = c(NA, -21L))

欢迎所有建议 - 谢谢!

2 个答案:

答案 0 :(得分:3)

这是基础R单线程使用ave

df$A <- ave(df$X, df$Subject, FUN = function(x) if (max(x) == 3) 1 else 0)

> df
   Subject Year X A
1        A 1990 1 0
2        A 1991 1 0
3        A 1992 2 0
4        A 1993 3 0
5        A 1994 4 0
6        A 1995 4 0
7        B 1990 0 0
8        B 1991 1 0
9        B 1992 1 0
10       B 1993 2 0
11       C 1991 1 1
12       C 1992 2 1
13       C 1993 3 1
14       C 1994 3 1
15       D 1991 1 0
16       D 1992 2 0
17       D 1993 3 0
18       D 1994 4 0
19       D 1995 5 0
20       D 1996 5 0
21       D 1997 6 0

答案 1 :(得分:0)

然后,如果您只想捕获增量,使用shift功能可以访问其他行。这个解决方案有效,但第一个值是NA,因为它无法与

进行比较
mydata$A <- ifelse(mydata$X > shift(mydata$X, 1L, type="lag"), 1,0)