2015-11-28 24 views
1

我正在努力研究如何將因子水平拆分爲取決於它們在時間序列中的位置的新水平。根據時間序列中的位置將因子水平分解爲新的水平

花一些玩具數據:

Time <- c(1:18) 
Factor <- as.factor(c(1,1,1,2,2,2,3,3,3,1,1,1,2,2,2,3,3,3)) 
Value <- c(rnorm(18)) 
df <- data.frame(Time, Factor, Value) 
str(df) 
'data.frame': 18 obs. of 3 variables: 
$ Time : int 1 2 3 4 5 6 7 8 9 10 ... 
$ Factor: Factor w/ 3 levels "1","2","3": 1 1 1 2 2 2 3 3 3 1 ... 
$ Value : num -0.728 -0.715 1.771 -0.54 -0.433 ... 

有了這些數據,變量因子是用3個級別的因子。我想根據它在時間序列中的出現來分割各個級別。因此,第一次出現因子1的塊我想重命名1.1,1.1,1.1第二次出現我想重命名它1.2,1.2,1.2等

任何人都可以提出一個這樣做的方式? 五月真實數據有一​​個變量MIU_VALVE這是一個因素,我不會應用任何建議的13個級別。這是我的真實數據的結構:

str(data1) 
'data.frame': 85874 obs. of 19 variables: 
$ Time  : POSIXct, format: "2015-06-08 09:55:48" "2015-06-08 09:55:48"  "2015-06-08 09:55:49" "2015-06-08 09:55:50" ... 
$ [N2O]_ppm : num 0.333 0.333 0.334 0.333 0.333 ... 
$ d15NA  : num -17.9 -41.1 -49 -32.4 -29.2 ... 
$ d15NB  : num -28.4 -56.7 -21.2 -61.3 -59.7 ... 
$ d18O  : num -337 -291 -287 -284 -304 ... 
$ d15N  : num -23.2 -48.9 -35.1 -46.8 -44.4 ... 
$ SP   : num 10.5 15.6 -27.8 28.9 30.5 ... 
$ [NNO]_ppm : num 0.328 0.328 0.328 0.328 0.328 ... 
$ [NN15O]_ppm: num 0.00238 0.00233 0.00231 0.00235 0.00236 ... 
$ [N15NO]_ppm: num 0.00236 0.00229 0.00238 0.00228 0.00228 ... 
$ [NNO18]_ppm: num 0.000435 0.000466 0.000469 0.000471 0.000457 ... 
$ [H2O]_ppm : num 33880 33817 34059 33714 33399 ... 
$ GasP_torr : num 45.4 45.4 45.4 45.4 45.4 ... 
$ GasT_C  : num 41.3 41.3 41.3 41.3 41.3 ... 
$ AmbT_C  : num 42.2 42.2 42.2 42.2 42.2 ... 
$ LTC0_v  : num 0.0434 0.0434 0.0434 0.0434 0.0434 ... 
$ AIN6  : num 1.16 1.16 1.16 1.16 1.16 ... 
$ DetOff  : num 1.13 1.13 1.13 1.13 1.13 ... 
$ MIU_VALVE : Factor w/ 13 levels "1","2","3","4",..: 2 2 2 2 2 2 2 2 2 2 ... 

回答

0

我們可以使用data.table。將'data.frame'轉換爲'data.table'(setDT(df)),創建一個運行長度的id變量('gr'),按'Factor'分組,我們match'gr'與'gr'的unique元素和paste具有該索引的'因子'創建新變量'因子1'。

library(data.table)#v1.9.6+ 
setDT(df)[, gr := rleid(Factor) 
    ][, Factor1 :=paste(Factor, match(gr, unique(gr)),sep='.') , by = Factor 
    ][, gr := NULL] 

df 
# Time Factor  Value Factor1 
# 1: 1  1 -0.85048947  1.1 
# 2: 2  1 -0.01022297  1.1 
# 3: 3  1 1.03636468  1.1 
# 4: 4  2 0.73873050  2.1 
# 5: 5  2 0.94553427  2.1 
# 6: 6  2 1.41944508  2.1 
# 7: 7  3 -0.43160988  3.1 
# 8: 8  3 -0.11538509  3.1 
# 9: 9  3 -0.66212385  3.1 
#10: 10  1 -0.97640087  1.2 
#11: 11  1 -2.13485778  1.2 
#12: 12  1 -0.18982403  1.2 
#13: 13  2 0.47546599  2.2 
#14: 14  2 0.79378768  2.2 
#15: 15  2 1.04461781  2.2 
#16: 16  3 0.29617799  3.2 
#17: 17  3 0.17126235  3.2 
#18: 18  3 0.36256006  3.2 

還是一個base R選項將使用rle讓遊程編碼,通過「價值」分組後改變「價值」的序列,並paste與「因子」列。

df$Factor1 <- paste(df$Factor, 
     inverse.rle(within.list(rle(as.character(df$Factor)), 
       values <-ave(lengths, values, FUN=seq_along))), 
        sep='.') 
df$Factor1 
#[1] "1.1" "1.1" "1.1" "2.1" "2.1" "2.1" "3.1" "3.1" "3.1" "1.2" "1.2" "1.2" "2.2" "2.2" "2.2" "3.2" "3.2" "3.2"