2016-07-14 61 views
-2

我有一個數據集,看起來是這樣的:如何在R中生成一個「範圍」變量?

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)) 

歡迎您提出所有建議 - 謝謝!

+1

因此,如果最大x值爲3,那麼A應該是1? –

+0

如果主題'E'的值爲2和3,你想標記它嗎?還是它必須是1,2,3?如何2,3,1 ... – zx8754

+0

老實說,這個問題並不清楚。通過提供明確的問題幫助用戶爲您提供幫助。 – SabDeM

回答

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 
+0

你有'C 1994 3 1',但OP說它應該是0 – user5249203

+0

謝謝,我已經更新了這個問題,但我想我可以將它作爲一個新問題發佈。但是這個代碼運行良好! – FKG

+2

也只是'(ave(df $ X,df $ Subject,FUN = max)== 3)+ 0'大概 –

0

然後,如果你只想要捕捉的增加,你可以訪問到其他行移位功能。此解決方案有效,但首先值是NA,因爲它沒有任何東西可與

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