2012-10-18 108 views
1

這一個掙扎:
的樣本數據:[R骨料與RLE功能

foo <- structure(c("1", "1", "1", "1", "1", "1", "2", "2", "2", "2", 
"2", "2", "2", "2", "2", "C", "C", "C", NA, NA, NA, NA, "C", 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, "C", 
"C", NA, NA, NA, NA, NA, "C", "C", "C", "C", "C", "C", "C", "C", 
"C", "C", "C", NA, NA, NA, NA, "C", "C", "C", "C", "C", "C", 
"C", "C", NA, NA, NA, NA, NA, NA, NA, NA, "C", "C", "C", NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, "C", "C", "C", NA, NA, 
NA, NA, NA, "C", "C", NA, NA, NA, NA, NA, "C", "C", "C", NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, "C", "C", NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, "C", "C", "C", "C", 
"C", "C", "C", "C", "C", "C", "C", "C", "C", "C", "C", "C", "C", 
"C", NA, NA, "C", "C", "C", "C", "C", NA, "C", "C", "C", "C", 
"C", "C", "C", "C", "C", "C", "C", "C", "C", "C", "C", "C", "C", 
"C", "C", NA, NA, "C", "C", NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA), .Dim = c(15L, 13L), .Dimnames = list(NULL, c("weeks", 
"vv", "rv", "ja", "aa", "bv", "aj", "vb", "rj", "rr", "vr", "bb", 
"jr"))) 

如何組論文DATAS按周和應用RLE功能?預計產出將是:

out <- structure(c("weeks", "1", "2", "vv", "1", "1", "rv", "0", "1", 
"ja", "1", "1", "aa", "1", "1", "bv", "1", "0", "aj", "1", "1", 
"vb", "1", "0", "rj", "1", "0", "rr", "1", "1", "vr", "2", "2", 
"bb", "1", "1", "jr", "1", "0"), .Dim = c(3L, 13L), .Dimnames = list(
    NULL, NULL)) 

到目前爲止已經試過:

test <- aggregate(foo, by=data.frame(foo[,1]), function(x,na.rm=T) rle(as.numeric(x))$values) 

給了我一個清單(如預期與RLE),我可以然後計算並得到預期的輸出。但我相信有一個更清晰的方式來實現這一目標......任何想法?

感謝您的期待!

+0

你真的有矩陣輸入,想要矩陣輸出嗎?你如何確定輸出值?我看不出'out'中的11h列('vr')不是2(或者都是1 ...)你在尋找每週的跑步次數嗎? – Justin

+0

是的,矩陣作爲輸入和輸出。輸出值是每週運行的次數。是的vr in out應該都是2,編輯問題。 – Chargaff

+0

幾乎...好主意。不知道我可以使用條件內的條件。如果我理解你的代碼 ,你可以通過指定長度> 1來「省略」NA值嗎? 是嗎?問題是我需要總結 那些長度爲1的運行... – Chargaff

回答

4

顯然一堆的方式來處理RLE輸出;這是另一個。

d <- data.frame(foo) 
aggregate(!is.na(d[,-1]), d[,1,drop=FALSE], function(x) sum(rle(x)$values)) 
# weeks vv rv ja aa bv aj vb rj rr vr bb jr 
# 1  1 1 0 1 1 1 1 1 1 1 2 1 1 
# 2  2 1 1 1 1 0 1 0 0 1 2 1 0 
+1

你可以避免先轉換爲'data.frame'如下:'aggregate(!is.na(foo [,-1]),list(weeks = foo [,1,drop = FALSE]),function(x)sum(rle(x)$ values))'+1 – A5C1D2H2I1M1N2O1R2T1

+0

對我的實際數據集非常有幫助,想法是!is.na。 = FALSE? – Chargaff

+0

'drop = FALSE'將它保留爲一個數據框(這是一種列表),所以你不需要像@mrdwab所說的那樣在調用'list'的時候包裝第二個參數。沒問題,這只是個人喜好而已。 – Aaron

4

我結束了非常相似......不知道哪個回答你的東西正在尋找:

aggregate(list(foo[, -1]), list(weeks = foo[, 1]), 
      function(x) length(na.omit(rle(x)$values))) 

    weeks vv rv ja aa bv aj vb rj rr vr bb jr 
1  1 1 0 1 1 1 1 1 1 1 2 1 1 
2  2 1 1 1 1 0 1 0 0 1 2 1 0 
+0

+1我沒有看到OP的更新「out」。我認爲這是他們想要的。如果是這樣,我會刪除我的答案以保持整潔。順便說一句,你是否能夠按原樣得到這個輸出?我必須使用'rle(as.character(x))'。 – A5C1D2H2I1M1N2O1R2T1

+0

不,我不能得到輸出,需要as.character – Chargaff

+0

哦,我的「選項(stringsAsFactors = FALSE)'在我的'.Rprofile' ...總是忘記它不是默認! – Justin