我尝试使用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)
我很感激每一条评论。感谢
答案 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