簡體   English   中英

是否有一個R包具有data.frame的通用類,其中列可以是數組(或者我如何定義這樣的類)?

[英]Is there an R package with a generalized class of data.frame in which a column can be an array (or how do I define such a class)?

我一直在想這個很長一段時間。 基數R中的data.frame類僅允許將列作為向量。 我正在尋找一個可以對此進行概括的程序包,以便每個“列”可以是二維數組,甚至可以是nd數組,其方法與原始類data.frame類似,例如使用“ []”進行子設置,合並,聚合,等等

我之類的原因是要處理蒙特卡洛模擬數據。 例如,對於每個模擬,結果都可以表示為數據幀,其中行索引是日期,而列包括字符和數字。 如果我模擬1000次,那么我將得到1000個這樣的數據幀。 如果R中有一個可以將結果存儲在一個對象中的類,並且具有大多數data.frame方法的便利性,則這將使我的編碼更加容易。

由於找不到這樣的程序包,因此嘗試創建自己的程序包沒有成功。 我遇到了帶有“ DataFrame”類的“ S4Vectors”軟件包,該類“支持以列的形式存儲任何類型的對象(具有長度和[方法)”。 這是我的嘗試。 library(S4Vectors) test <- matrix(1:6,2,3) test1 <- matrix(7:12,2,3) setClass("Column", slots=list(), contains = "matrix") setMethod("length", "Column", function(x) {nrow(x)}) '[.Column' <- function(x, i, j, ...) { i <- ((i-1)*ncol(x)+1):(i*(ncol(x))) NextMethod() } testColumn <- new("Column", test) testColumn1 <- new("Column", test1) length(testColumn) testColumn[1] testDataFrame <- DataFrame(Col1 = testColumn, Col2 = testColumn1)我確實獲得了長度和[方法有效,但最后一條語句給出了錯誤“無法將類” Column“強制轉換為DataFrame”。

有沒有人嘗試做類似的事情?

更新:感謝G. Grothendieck,我現在知道數據幀可以通過使用I()函數將矩陣作為列。 現在,我想知道是否有辦法在所有操作中保留這種結構。 一個例子是聚合數據幀

data.frame(v = c(1,1,2,2), m = I(diag(4)))

用v表示,結果是

data.frame(v = c(1,2), m = I(matrix(c(1,1,0,0,0,0,1,1), 2, 4, byrow = T)))

數據框確實允許矩陣列:

m <- diag(4)
v <- 1:4
DF <- data.frame(v, m = I(m))
str(DF)

給予:

'data.frame':   4 obs. of  2 variables:
 $ v: int  1 2 3 4
 $ m: 'AsIs' num [1:4, 1:4] 1 0 0 0 0 1 0 0 0 0 ...

更新1

R aggregate函數可以創建矩陣列。 例如,

DF <- data.frame(v = 1:4, g = c(1, 1, 2, 2))
ag <- aggregate(v ~ g, DF, function(x) c(sum = sum(x), mean = mean(x)))
str(ag)

給予:

'data.frame':   2 obs. of  2 variables:
 $ g: num  1 2
 $ v: num [1:2, 1:2] 3 7 1.5 3.5
  ..- attr(*, "dimnames")=List of 2
  .. ..$ : NULL
  .. ..$ : chr  "sum" "mean"

更新2

我不認為R中很好地支持注釋中討論的聚合,但是您可以使用以下解決方法:

m <- matrix(1:16, 4)
v <- c(1, 1, 2, 2)
DF <- data.frame(v, m = I(m))

nr <- nrow(DF)
ag2 <- aggregate(list(sum = 1:nr), DF["v"], function(ix) colSums(DF$m[ix, ]))
str(ag2)

給予:

'data.frame':   2 obs. of  2 variables:
 $ v  : num  1 2
 $ sum: num [1:2, 1:4] 3 7 11 15 19 23 27 31

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM