Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.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_Loops_For Loop_Matrix - Fatal编程技术网

R 根据矩阵中的单元格值删除列,并消除下标越界错误

R 根据矩阵中的单元格值删除列,并消除下标越界错误,r,loops,for-loop,matrix,R,Loops,For Loop,Matrix,我有一个问题,我必须删除Excel文件中的某些列,这取决于使用R的某些单元格值 我导入了Excel文件 data = as.matrix(read.csv('data.csv', header = FALSE)) 矩阵的维数为:dim(数据)=106474*81 我需要做什么 如果任何单元格中的值[行=1,列=i]='a'->删除列 如果任何单元格中的值[行=1,列=i]='B'->删除列 如果任何单元格中的值[行=2,列=i]>30->删除列 到目前为止我做了什么 for (i in

我有一个问题,我必须删除Excel文件中的某些列,这取决于使用R的某些单元格值

  • 我导入了Excel文件

    data = as.matrix(read.csv('data.csv', header = FALSE))
    
  • 矩阵的维数为:
    dim(数据)=106474*81

  • 我需要做什么

    • 如果任何单元格中的值
      [行=1,列=i]='a'->
      删除列
    • 如果任何单元格中的值
      [行=1,列=i]='B'->
      删除列
    • 如果任何单元格中的值
      [行=2,列=i]>30->
      删除列
  • 到目前为止我做了什么

    for (i in 1:ncol(data)) { 
      if (data[1,i]=='A') {
        data =  data [,-i]
      } else if (data[1,i]=='B') {
        data =  data [,-i]
      } else if (data[2,i] > 30) {
        data =  data [,-i]
      } 
    }
    
  • 我遇到的问题如下:

  • 当我把矩阵读给r时,它把所有的东西都读成字符?如何将数据[2,i]行转换为 数字的。我提供了如何将其转换为数字。但是有更好的办法吗

    row2 = as.numeric(as.matrix(fly_data[2,])) 
    fly_data[2,] <- row2
    
  • 它总是给人一种感觉

    数据[1,i]中出错:下标超出范围


  • 也许你可以试试下面的代码

    r <- subset(data, select = -which(as.character(unlist(data[1,]))%in% c("A","B") | as.numeric(as.character(unlist(data[2,])))>30))
    
    数据

    data <- structure(list(X1 = structure(2:1, .Names = c("r1", "r2"), .Label = c("7", 
    "A"), class = "factor"), X2 = structure(2:1, .Names = c("r1", 
    "r2"), .Label = c("6", "D"), class = "factor"), X3 = structure(2:1, .Names = c("r1", 
    "r2"), .Label = c("24", "C"), class = "factor"), X4 = structure(2:1, .Names = c("r1", 
    "r2"), .Label = c("13", "A"), class = "factor"), X5 = structure(2:1, .Names = c("r1", 
    "r2"), .Label = c("27", "B"), class = "factor"), X6 = structure(2:1, .Names = c("r1", 
    "r2"), .Label = c("17", "A"), class = "factor"), X7 = structure(2:1, .Names = c("r1", 
    "r2"), .Label = c("25", "C"), class = "factor"), X8 = structure(2:1, .Names = c("r1", 
    "r2"), .Label = c("35", "C"), class = "factor"), X9 = structure(2:1, .Names = c("r1", 
    "r2"), .Label = c("13", "B"), class = "factor"), X10 = structure(2:1, .Names = c("r1", 
    "r2"), .Label = c("27", "B"), class = "factor")), class = "data.frame", row.names = c("r1", 
    "r2"))
    
    > data
       X1 X2 X3 X4 X5 X6 X7 X8 X9 X10
    r1  A  D  C  A  B  A  C  C  B   B
    r2  7  6 24 13 27 17 25 35 13  27
    
    数据
    x1x2x3x4x5x6x7x8x9x10
    r1 A D C A B A C B B
    r2 7 6 24 13 27 17 35 13 27
    
    当您阅读时,您可能会得到更多/更好的答案。您试图阅读的文件是
    .csv
    ?那么我就不会称之为“excel”文件,这只会导致混乱。至于为什么所有的值都是字符的问题:一个矩阵只能包含一种类型的值,所以如果其中任何一个值是字符串,那么整个矩阵将被转换为字符。对混合类型使用
    data.frame
    data.table::data.table
    。然后指定for循环从1变为
    ncol(data)
    ,但是在循环中从
    数据中删除列
    ——这就是为什么
    下标超出范围
    错误的原因。你可以先复制一份,然后对它进行变异,而不是原来的。非常感谢。成功了。1.通过使用jogo as.numeric(数据[2,i])>30 2解决了数值问题。通过使用数据的副本运行循环来解决越界问题。因此,原始矩阵运行for循环,而新矩阵正按照@dario的建议进行变异。
    i30);数据新
    
    > r 
       X2 X3 X7
    r1  D  C  C
    r2  6 24 25
    
    data <- structure(list(X1 = structure(2:1, .Names = c("r1", "r2"), .Label = c("7", 
    "A"), class = "factor"), X2 = structure(2:1, .Names = c("r1", 
    "r2"), .Label = c("6", "D"), class = "factor"), X3 = structure(2:1, .Names = c("r1", 
    "r2"), .Label = c("24", "C"), class = "factor"), X4 = structure(2:1, .Names = c("r1", 
    "r2"), .Label = c("13", "A"), class = "factor"), X5 = structure(2:1, .Names = c("r1", 
    "r2"), .Label = c("27", "B"), class = "factor"), X6 = structure(2:1, .Names = c("r1", 
    "r2"), .Label = c("17", "A"), class = "factor"), X7 = structure(2:1, .Names = c("r1", 
    "r2"), .Label = c("25", "C"), class = "factor"), X8 = structure(2:1, .Names = c("r1", 
    "r2"), .Label = c("35", "C"), class = "factor"), X9 = structure(2:1, .Names = c("r1", 
    "r2"), .Label = c("13", "B"), class = "factor"), X10 = structure(2:1, .Names = c("r1", 
    "r2"), .Label = c("27", "B"), class = "factor")), class = "data.frame", row.names = c("r1", 
    "r2"))
    
    > data
       X1 X2 X3 X4 X5 X6 X7 X8 X9 X10
    r1  A  D  C  A  B  A  C  C  B   B
    r2  7  6 24 13 27 17 25 35 13  27