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
相同。
謝謝;我沒有聽說過'slice.index',並且'replace'也以某種方式傳遞了我。不幸的是,這是巧合:slice.index()只返回行和列整數,但我需要它在字符串上進行比較。我爲這個問題添加了幾個例子。 ()「和」col()「具有'as.factor'參數,但是如果它的確如此,我認爲你的解決方案可以工作? –
知道了!如果你第一次做:'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)'(如果你同意,你能更新你的答案嗎? ) –
@DarrenCook:是的,我相信你的解決方法似乎是合適的;我錯過了應該比較'dimnames'。我會根據您的評論進行更新 –