Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R长表到多维数组_R_Data.table_Transform - Fatal编程技术网

R长表到多维数组

R长表到多维数组,r,data.table,transform,R,Data.table,Transform,我有一个长格式的表格: require(data.table) sampleDT <- data.table(Old = c("A","B","A","B","A","B","A","B") , New = c("A","A","B","B","A","A","B","B") , Time = c(1,1,1,1,2,2,2,2) , value1 =

我有一个长格式的表格:

require(data.table)
sampleDT <- data.table(Old = c("A","B","A","B","A","B","A","B")
                       , New = c("A","A","B","B","A","A","B","B")
                       , Time = c(1,1,1,1,2,2,2,2)
                       , value1 = c(1,1,1,1,1,1,1,1)
                       , value2 = c(0,0,0,0,0,0,0,0))
print(sampleDT)

   Old New Time value1 value2
1:   A   A    1      1      0
2:   B   A    1      1      0
3:   A   B    1      1      0
4:   B   B    1      1      0
5:   A   A    2      1      0
6:   B   A    2      1      0
7:   A   B    2      1      0
8:   B   B    2      1      0
如何实现

内存使用和计算时间是重要的考虑因素,因为我们正在处理相对较大的数据集。

试试xtabs:

sampleDT <- data.frame(Old = c("A","B","A","B","A","B","A","B"), 
                       New = c("A","A","B","B","A","A","B","B"),
                       Time = c(1,1,1,1,2,2,2,2),
                       value1 = c(1,1,1,1,1,1,1,1),
                       value2 = c(0,0,0,0,0,0,0,0))

Value1 <- xtabs(value1 ~ Old + New + Time, sampleDT, drop = FALSE)
Value2 <- xtabs(value2 ~ Old + New + Time, sampleDT, drop = FALSE)

is.array(Value1)
is.array(Value2)

Value1[, 2,] <- 0 # Sets all second columns to zero for Value1
Value2[1,,] <- 0 # Idem with first row for Value2
Value2[2,2,] <- Value2[2,2,] * (-1)

Result <- Value1 + Value2

Result

, , Time = 1

   New
Old A B
  A 1 0
  B 1 0

, , Time = 2

   New
Old A B
  A 1 0
  B 1 0

希望能有所帮助。

之后你将如何使用3d阵列?将数据保存在关系格式中可能更有效。看起来您将两个问题混为一谈:1计算数组中的值,2生成数组结构。data.table是高度优化的,所以我认为您可以计算数组中想要的任何值,将它们称为v,然后重新整形2::acastsampleDT[,.Old,New,Time,v],Old~New~Time,value.var=v。直接使用abind包或数组可能会有更高的效率,但我不认为有任何理由在这个问题中包含基于某种函数的计算。
sampleDT <- data.frame(Old = c("A","B","A","B","A","B","A","B"), 
                       New = c("A","A","B","B","A","A","B","B"),
                       Time = c(1,1,1,1,2,2,2,2),
                       value1 = c(1,1,1,1,1,1,1,1),
                       value2 = c(0,0,0,0,0,0,0,0))

Value1 <- xtabs(value1 ~ Old + New + Time, sampleDT, drop = FALSE)
Value2 <- xtabs(value2 ~ Old + New + Time, sampleDT, drop = FALSE)

is.array(Value1)
is.array(Value2)

Value1[, 2,] <- 0 # Sets all second columns to zero for Value1
Value2[1,,] <- 0 # Idem with first row for Value2
Value2[2,2,] <- Value2[2,2,] * (-1)

Result <- Value1 + Value2

Result

, , Time = 1

   New
Old A B
  A 1 0
  B 1 0

, , Time = 2

   New
Old A B
  A 1 0
  B 1 0