2016-05-05 20 views
1

我有一個3D數組,其中內部矩陣的rownames和colnames是datestamp字符串。我希望它分離成兩個3D陣列:柱後(NAS如果之前或等於)根據姓名和rownames過濾R數組

  • 行是
  • 行是前/等於柱(NAS如果之後)

下面是一些測試數據:

dimnames = list(
    c("A", "B"), 
    c("2015-12-01", "2016-01-01", "2016-02-01"), 
    c("2015-12-01", "2016-01-01", "2016-02-01", "2016-03-01") 
) 
v = array(1:24, 
    dim = lapply(dimnames,length), 
    dimnames = dimnames 
) 

然後我想執行一些神奇的位置:

ret = split_it_up(v) 
v1 = ret[[1]] 
v2 = ret[[2]] 

然後v1["A",,]看起來就像這樣:

  2015-12-01 2016-01-01 2016-02-01 2016-03-01 
2015-12-01   NA   NA   NA   NA 
2016-01-01   3   NA   NA   NA 
2016-02-01   5   11   NA   NA 

v2["A",,]看起來就像這樣:

  2015-12-01 2016-01-01 2016-02-01 2016-03-01 
2015-12-01   1   7   13   19 
2016-01-01   NA   9   15   21 
2016-02-01   NA   NA   17   23 

(和v1["B",,]v2["B",,]將已經以同樣的方式被拆分)

受到lower.tri()作品的啓發,迄今爲止我的最佳嘗試是使用2D矩陣(例如vx = v["A",,])我可以這樣做:

matrix(
    as.character(row(vx,as.factor=T)) > as.character(col(vx,as.factor=T)), 
    c(3,4)) 

這給:

 [,1] [,2] [,3] [,4] 
[1,] FALSE FALSE FALSE FALSE 
[2,] TRUE FALSE FALSE FALSE 
[3,] TRUE TRUE FALSE FALSE 

但後來我不能完全制定出如何處理它呢,更別說如何得到它,爲的所有片工作3D數組。

UPDATE:

一些不同的測試數據,以確保一個解決方案不能作出有關的行和列的排序假設。

dimnames = list(
    c("A", "B"), 
    c("2016-01-01", "2015-12-01", "2016-02-01"), 
    c("2016-02-01", "2015-12-01", "2016-03-01", "2016-01-01") 
) 
v = array(1:24, 
    dim = lapply(dimnames,length), 
    dimnames = dimnames 
) 

v["A",,]樣子:

  2016-02-01 2015-12-01 2016-03-01 2016-01-01 
2016-01-01   1   7   13   19 
2015-12-01   3   9   15   21 
2016-02-01   5   11   17   23 

v1["A",,]將是:

  2016-02-01 2015-12-01 2016-03-01 2016-01-01 
2016-01-01   NA   7   NA   NA 
2015-12-01   NA   NA   NA   NA 
2016-02-01   NA   11   NA   23 

v2["A",,]將是:

  2016-02-01 2015-12-01 2016-03-01 2016-01-01 
2016-01-01   1   NA   13   19 
2015-12-01   3   9   15   21 
2016-02-01   5   NA   17   NA 

而另一個更極端的EXA mple:

dimnames = list(
    c("A", "B"), 
    c("2015-10-01", "2015-12-01", "2015-11-01"), 
    c("2016-02-01", "2016-04-01", "2016-03-01", "2016-01-01") 
) 
v = array(1:24, 
    dim = lapply(dimnames,length), 
    dimnames = dimnames 
) 

這裏所有列都大於所有行。所以v1將是所有的NA,並且v2將與v相同。

回答

3

看來,你要找的splice.index比較最後兩個維度的「dimnames」:

# using "v" of your second example (first after update) 
dnm2 = dimnames(v)[[2]][slice.index(v, 2)] 
dnm3 = dimnames(v)[[3]][slice.index(v, 3)] 

v1 = replace(v, dnm2 <= dnm3, NA) 
v2 = replace(v, dnm2 > dnm3, NA) 

v1["A", , ] 
#   2016-02-01 2015-12-01 2016-03-01 2016-01-01 
#2016-01-01   NA   7   NA   NA 
#2015-12-01   NA   NA   NA   NA 
#2016-02-01   NA   11   NA   23 
v2["A", , ] 
#   2016-02-01 2015-12-01 2016-03-01 2016-01-01 
#2016-01-01   1   NA   13   19 
#2015-12-01   3   9   15   21 
#2016-02-01   5   NA   17   NA 
v1["B", , ] 
v2["B", , ] 
+0

謝謝;我沒有聽說過'slice.index',並且'replace'也以某種方式傳遞了我。不幸的是,這是巧合:slice.index()只返回行和列整數,但我需要它在字符串上進行比較。我爲這個問題添加了幾個例子。 ()「和」col()「具有'as.factor'參數,但是如果它的確如此,我認爲你的解決方案可以工作? –

+0

知道了!如果你第一次做:'ix2 = dimnames(v)[[2]] [slice.index(v,2)]'和'ix3 = dimnames(v)[[3]] [slice.index(v,3) ]',那麼它可以寫成'v1 = replace(v,ix2 <= ix3,NA)'和'v2 = replace(v,ix2> ix3,NA)'(如果你同意,你能更新你的答案嗎? ) –

+0

@DarrenCook:是的,我相信你的解決方法似乎是合適的;我錯過了應該比較'dimnames'。我會根據您的評論進行更新 –