【问题标题】:how to subset part of data using for-loop如何使用for循环对部分数据进行子集化
【发布时间】:2018-04-26 20:43:35
【问题描述】:

我最近是 R 编程的新手。

我想将现有的矩阵形式转换为新的形式。

我的矩阵如下,

数据()

    1       2       3       4       5       6
1   0.60!   0.29!   1.42!   0.64    1.06    1.02 
2   1.33!   0.68!   1.44!   1.44    1.05    1.03 
3   0.60    0.67@   0.64    1.37    2.40    1.00 
4   1.37    0.29    1.43    0.63    1.05    2.32 
5   1.39    0.68    1.40    1.46    1.06    1.02 
6   0.63    0.68    0.61    1.46    1.74    1.05 
7   1.39    0.68    1.01    0.65    2.43    2.27 
.... 

我在第一行列出了 '!'和“@”便于理解。

我想要的是,

变量()

    1       2       3       4       5       6       7
1   0.60!   0.29!   1.42!   1.33!   0.68!   1.44!   0.67@ 
2   0.29    1.42    0.64    0.68    1.44    1.44    0.64 
3   1.42    0.64    1.06    1.44    1.44    1.05    1.37 
4   0.64    1.06    1.02    1.44    1.05    1.03    2.40 
5   1.33    0.68    1.44    0.60    0.67    0.64    0.29                        
6                           
….      

我想将 1:2 行和 1:3 列的数据列在一行中,并将 (3,2) 的值定位到 vari 矩阵中的 (1,7)。

我认为它适用于 for 循环。我编写了代码,但是,这是我第一次编写代码。所以,效果不好。

这是我的试验......

x=matrix(nrow = nrow(data)-2, ncol = 8);

for ( i in 1:(nrow(data)))
{ for ( j in 1:(ncol(data)))
{
  x[i,j]<-((c(as.vector(t(as.matrix(data[i:i+1,j:j+2]))),data[i+2,j+1])))
}
}
x

但是,它代表下面的句子

“数据错误[i:i + 1, j:j + 2]:下标越界”

请帮帮我!!!

【问题讨论】:

  • 当您使用j+2j+1 以及类似地I+1i+2 时,对于最后一列或最后一行,它会比数据集维度中的多1 或2 .您可以将代码更改为 1:(nrow(data)-2),与 j 类似(未测试)

标签: r for-loop dataframe subset


【解决方案1】:

您需要改进对第二个数据框的索引,为此我添加了n 计数器。

x=matrix(nrow = nrow(data)-2, ncol = 7);

n=1
for ( i in 1:(nrow(data)-3)){ 
  for ( j in 1:(ncol(data)-2)){
    x[n,]<-c(t(data[i:(i+1),j:(j+2)]),data[i+2,j+1])
    n=n+1
  }
}

 x
     [,1] [,2] [,3] [,4] [,5] [,6] [,7]
[1,] 0.60 0.29 1.42 1.33 0.68 1.44 0.67
[2,] 0.29 1.42 0.64 0.68 1.44 1.44 0.64
[3,] 1.42 0.64 1.06 1.44 1.44 1.05 1.37
[4,] 0.64 1.06 1.02 1.44 1.05 1.03 2.40
[5,] 1.33 0.68 1.44 0.60 0.67 0.64 0.29

还要小心 i:i+1i:(i+1) 不同,这是您所追求的。

【讨论】:

  • geeee............先生,我真的有很大的帮助......非常感谢!谢谢你,再次感谢你!
  • 太好了!如果它对您有用,请随时接受答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-14
  • 1970-01-01
  • 2015-06-20
  • 1970-01-01
  • 2018-06-21
  • 2018-09-15
相关资源
最近更新 更多