R:如何使用cast-function在循环中创建矩阵?

时间:2015-09-24 11:23:00

标签: r matrix casting

我尝试使用list中的cast函数,每年reshape-package制作年度国家/地区导入矩阵。当我尝试一年时,一切正常。请参阅代码(下面的测试数据集!):

OCTC2011 <- cast(OC ~ TC, data =Import_Year[["2011"]], value = "Value")

结果是一个矩阵,其中包含2011年从原产国(OC)(行)到目标国家(TC)(列)的进口值。

然而,由于我使用不同年份的不同产品组成的大型数据集,我想将此过程置于循环中。我试过以下:

library(reshape)
OCTC <- 0
for(i in 1:length(unique(Import_Year))) 
{
  OCTC[i] <- cast(OC ~ TC, data =Import_Year[[i]], value = "Value")
}

哪个发出警告:number of items to replace is not a multiple of replacement length,可能是由于索引错误,因为我几乎不熟悉循环。

在这里,我为我的问题制作了一个简单的数据集:

OC <- c("A", "A", "B", "B", "C", "C", "D", "D")
TC <- c("Z", "Z", "Y", "Y", "X", "X", "W", "W")
Value <- c(1,2,3,4,5,6,7,8)
Year <- c(2010,2011)
df_import <- data.frame(OC,TC,Value, Year)
Import_Year <- split(df_import, df_import$Year)

我很感激每一条评论。感谢

1 个答案:

答案 0 :(得分:2)

在@DavidArenburg评论中,您应该使用dcast参数中的reshape2包中的value.var函数。

除此之外,循环应该是这样的:

library(reshape2)
OCTC <- list()
for(i in 1:length(unique(Import_Year))) 
{
  OCTC[[length(OCTC)+1]] <- dcast(OC ~ TC, data =Import_Year[[i]], value.var = "Value")
}

因此,您使用list()(而不是值为零的变量)启动列表,然后将每个dcast添加为该列表的元素。

输出:

> OCTC
[[1]]
  OC  W  X  Y  Z
1  A NA NA NA  1
2  B NA NA  3 NA
3  C NA  5 NA NA
4  D  7 NA NA NA

[[2]]
  OC  W  X  Y  Z
1  A NA NA NA  2
2  B NA NA  4 NA
3  C NA  6 NA NA
4  D  8 NA NA NA