2014-05-01 54 views
-1

在R中,我使用for循环遍历大数据框,尝试将第*列第7列中的整数放入另一个矩阵中的特定索引。特定索引对应于大数据框中的索引(再次在第* i *行中,而是第2和第4列)。例如,假设我的数据帧有data_frame [1,2] = 5,data_frame [1,4] = 12,data_frame [1,7] = 375。我想把375放入索引中的行,其中行的名称为5,列的名称为12.R中的数据框到矩阵

但是,问题(我认为)是当我做col_index = which(colnames(matrix) == data_frame [1,2]),它返回整数0.列名在技术上是5,但我注意到它只适用于我做col_index = which(colnames(matrix)==“5”)。我怎样才能确保(在我的for循环)data_frame [我,2]对应于“5”?

数据被保存为“走出去”我的矩阵,我想将数据放在被称为“M”

m=matrix(nrow=87,ncol=87) 
fips=sprintf("%03d",seq(1,173,by=2)) 
colnames(m)=fips 
rownames(m)=fips 
m[1:40,1:40] 

接下来,第三列是等于27

for(i in 8:2446) 
{ 
if(out[i,3]==27) 
{ 
out_col=out[i,4] 
out_row=out[i,2] 
moves=out[i,7] 
col_index=which(colnames(m)==paste(out_col)) 
row_index=which(rownames(m)==paste(out_row)) 
m[row_index,col_index]=moves 
} 
} 
条件

对不起格式。它将数字放在矩阵中,但它们不是正确的数字,我无法弄清楚什么是错的。任何帮助将非常感激!

回答

1

您的示例中存在很多复杂性,但归结为替换mat中的值,其中行名,列名和新值存储在out中。 (!那将是有益的,如果你发布一个)让我们从一个重复的例子,开始

# Matrix to have values replaced 
mat <- matrix(0, nrow=3, ncol=3) 
rownames(mat) <- c("1", "2", "3") 
colnames(mat) <- c("4", "5", "6") 
mat 
# 4 5 6 
# 1 0 0 0 
# 2 0 0 0 
# 3 0 0 0 

out <- data.frame(row=c(1, 3, 3), col=c(6, 5, 4), val=c(1, 4, -1)) 
out 
# row col val 
# 1 1 6 1 
# 2 3 5 4 
# 3 3 4 -1 

现在,做更换一个班轮:

mat[cbind(as.character(out$row), as.character(out$col))] <- out$val 
mat 
# 4 5 6 
# 1 0 0 1 
# 2 0 0 0 
# 3 -1 4 0 

基本上,我们索引mat由2列矩阵表示,其中索引矩阵的每一行都是行名和列名。

在你的榜样,你似乎排除了前7行out,以及任何基于行的上的东西,如realout <- out[out[,3] == 27 & seq(nrow(out)) %in% 8:2446,]这些要求,其中out[,3]不等于27.你可以简单地亚群out,然后做替换与realout

请注意,以这种方式进行替换的另一个好处是,它将比在out行中使用for循环快得多。