【问题标题】:Unable to Write to Matrix From Loop in R无法从 R 中的循环写入矩阵
【发布时间】:2017-04-16 13:51:56
【问题描述】:

我正在尝试通过 apply 中的循环写入矩阵。具体来说,我想对数据集进行排序,并根据该特定变量的中位数将每个变量中的每个值分配为高或低。 这些高低将被输入到矩阵中。

到目前为止我的代码是:

我正在使用的 df 是一个包含 36 行和大量列的数据集,尽管我只对在这种情况下选择它们感兴趣。

rows <- 36
columns <- 100

output <- matrix(ncol = columns, nrow = rows)

apply(df[,463:500],2, function(x)
    for (i in 1:36){
    if (x[i] <= median(x)){
        output[i,x-462] <- "low"
    }
    else
        output[i,x-462] <- "high"
    })

首先,当我的代码中有 NA 时,我会收到错误消息: if (x[i]

我不知道如何让 R 忽略 NA。

第二个问题是,即使我只使用 df 中没有 NA 的列,代码也只是返回 null 并且矩阵仍然为空

我知道只需写入矩阵即可,例如:

> output[1,1] <- "low"
> output[1,1]
[1] "low"

感觉应该很简单,有什么想法吗?

谢谢

【问题讨论】:

  • 我们需要dput()df
  • R 是一种函数式编程语言,函数默认没有副作用,因此不能修改外部定义的矩阵。通常你可以使用 for 循环,或者如果你想使用apply(),构造一个新矩阵。

标签: r for-loop matrix apply


【解决方案1】:

试试这个:

sapply(df[,463:500], function(x) ifelse(x <= median(x, na.rm=T),'low','high'))

【讨论】:

    【解决方案2】:

    所以我最终让它与这段代码一起工作:

    rows <- 36
    columns = 50
    
    output <- matrix(ncol = columns, nrow = rows)
    
    
    for (i in 463:482){
      for (j in 1:36){
          if (is.na(df[j,i]) == FALSE){
              if (df[j,i] <= median(df[,i])){
                 output[j,i-462] <- "low"
            }
              else
                 output[j,i-462] <- "high"
        }
      }
    }
    

    我取消了申请。我承认我对基本循环更熟悉,而 apply lapply 几乎一点也不熟悉,所以这对我来说更有意义。

    但是这仍然无法处理 NA 并且总是得到错误

    missing value where TRUE/FALSE needed
    

    是否可以修改我的代码以补偿所有 NA 条目?

    【讨论】:

    • na.rm=TRUE 标志添加到中值函数。还可以从上面看一下 sirallen 的答案,它会比使用 for 循环快得多。
    猜你喜欢
    • 1970-01-01
    • 2012-02-21
    • 2021-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-29
    • 2021-12-31
    相关资源
    最近更新 更多