2016-03-27 25 views
0

,我有以下數據:如何識別唯一的行和獨特的觀察的data.frame,基於時間變量

d <- data.frame(id=c(1,2,3,4,5,6,7), 
      year=c(1999,1999,1999,2000,2000,2000,2000), 
      var1=c(1,1,2,1,4,1,8), 
      var2=c(1,1,2,1,5,2,0), 
      var3=c(0,0,0,0,7,0,0)) 

> d 
    id year var1 var2 var3 
1 1 1999 1 1 0 
2 2 1999 1 1 0 
3 3 1999 2 2 0 
4 4 2000 1 1 0 
5 5 2000 4 5 7 
6 6 2000 1 2 0 
7 7 2000 8 0 0 

我要評估data.frame的每一行,並返回一個得分一個名爲'梳子'的新變量。

如果行持有間VAR1-VAR3的組合是:

  • 往年從未觀察到(但元素是) - >分配梳= 1
  • 包含被從未見過的元件往年 - >分配梳= 2
  • 往年從未觀察到並保持一個新的元素 - >分配梳= 3
  • 往年觀察 - >分配梳= 0

一些旁註:

  • 發生的順序並不重要(1,1,2 == 1,2,1)
  • 同年重複組合可以被標記相同

在這個例子中的數據,這應該是這樣的:

d2 <- data.frame(id=c(1,2,3,4,5,6,7), 
      year=c(1999,1999,1999,2000,2000,2000,2000), 
      var1=c(1,1,2,1,4,1,8), 
      var2=c(1,1,2,1,5,2,0), 
      var3=c(0,0,0,0,7,0,0), 
      comb=c(3,3,3,0,3,1,2)) 
> d2 
    id year var1 var2 var3 comb 
1 1 1999 1 1 0 3 
2 2 1999 1 1 0 3 
3 3 1999 2 2 0 3 
4 4 2000 1 1 0 0 
5 5 2000 4 5 7 3 
6 6 2000 1 2 0 1 
7 7 2000 8 0 0 2 

注意,第二行被賦予梳= 3,因爲它是第一年,我們觀察到combinatio納秒。如果這個觀察結果在年= 200(如第4行),則分配一個零。

這可能嗎?任何幫助深表感謝!

+2

在你的輸出中,第二行似乎已經存在於那一年,爲什麼不是0? – adaien

+0

你能在輸出中寫出詳細的筆記來描述你想要的樣子嗎? – InfiniteFlashChess

+0

@adiana:我想在給定的年份中標記每個重複的觀察結果。 –

回答

1

可能有更好的方法來做到這一點,但這是一個可能的策略。首先,你可以創建一個字符串,它的var1...var3組合,像這樣:

> d2$var123 <- paste(d2$var1, d2$var2, d2$var3, sep="-") 
> d2 
    id year var1 var2 var3 var123 
1 1 1999 1 1 0 1-1-0 
2 2 1999 1 1 0 1-1-0 
3 3 1999 2 2 0 2-2-0 
4 4 2000 1 1 0 1-1-0 
5 5 2000 4 5 7 4-5-7 
6 6 2000 1 2 0 1-2-0 
7 7 2000 8 0 0 8-0-0 

在這一點上,你可以簡單(1)循環的所有元素; (2)檢查var值是否出現在var123或所有先前的var1...var3列的列表中,然後相應地指定您的comb值。這是一段僞代碼:

d2$comb <- 0 # Initialize column 
for (i in unique(d2$id)) { 
    previous <- subset(d2, d2$id < i) # All the years before 
    current <- subset(d2, d2$id == i) # The current row 
    previous_vals <- unique(c(previous$var1, previous$var2, previous$var3)) 
    previous_combos <- unique(previous$var123) 

    if (i$var1 %in% previous_vals | i$var1 %in% previous_vals...) { 
     d2$comb([d2$id==1] <- 1 
    } 
    if (i$var123) %in% previous_combos { 
     d2$comb[d2$id==i] <- 0 
    } 
    .... # Rest of conditions here 
} 
+1

'previous'不僅僅是'subset(d2,d2 $ id adaien

+1

中的同一年的數據。也許'previous'可以被定義爲'subset(d2,d2 $ year <= current $ year&d2 $ id!= current $ id)''。通過這種方式,我們可以將所有年份提升至「當前」,但仍排除「當前」。 –