【问题标题】:R matrix apply function withR矩阵应用函数
【发布时间】:2017-10-26 10:24:23
【问题描述】:

我有以下示例矩阵 x。

x <- data.frame(c1=c(1,2,3,2,1,3),
                    c2=c(4,5,6,2,3,4),
                    c3=c(7,8,9,7,1,6),
                    c4=c(4,0,9,1,5,0),
                    c5=c(3,8,0,7,3,6),
                    c6=c(2,8,5,0,5,7),
                    row.names = c("r1","r2","r3","r4","r5","r6"))

我需要对每一列应用函数 f,其中 cMin 是列最小值,cMax 是列最大值向量。

cMax <- colMaxs(mat)
cMin <- colMins(mat)

我正在尝试使用如下所示的应用函数apply(mat,2,f),但收到警告,结果也不正确。

f <- function(x) (x - cMin[])/(cMax - cMin)

警告: 警告信息:

1: In x - cMin[] :
  longer object length is not a multiple of shorter object length
2: In (x - cMin[])/(cMax - cMin) :
  longer object length is not a multiple of shorter object length
3: In x - cMin[] :
  longer object length is not a multiple of shorter object length
4: In (x - cMin[])/(cMax - cMin) :
  longer object length is not a multiple of shorter object length

谁能解释一下如何使用由向量(cMin 或 cMax)组成的 apply 函数?

【问题讨论】:

  • 您能说明一下您需要什么吗?是否要获取每个数据点并计算(data point - column min)/(column max - column min)
  • 你是对的。我想用 f 函数转换每个元素。

标签: r


【解决方案1】:

当从矩阵中减去向量时,由于矩阵的存储机制和回收规则,向量按列对齐;所以你可以转置matrix,用cMincMax进行计算,然后转置回来:

t((t(mat) - cMin)/(cMax - cMin))

#    c1   c2    c3        c4    c5    c6
#r1 0.0 0.50 0.750 0.4444444 0.375 0.250
#r2 0.5 0.75 0.875 0.0000000 1.000 1.000
#r3 1.0 1.00 1.000 1.0000000 0.000 0.625
#r4 0.5 0.00 0.750 0.1111111 0.875 0.000
#r5 0.0 0.25 0.000 0.5555556 0.375 0.625
#r6 1.0 0.50 0.625 0.0000000 0.750 0.875

【讨论】:

  • 该死的人!你是个天才。您能否简要解释一下它是如何工作的?
  • 感谢您的精彩解释。
【解决方案2】:
library(magrittr)
x <- data.frame(c1=c(1,2,3,2,1,3),
                c2=c(4,5,6,2,3,4),
                c3=c(7,8,9,7,1,6),
                c4=c(4,0,9,1,5,0),
                c5=c(3,8,0,7,3,6),
                c6=c(2,8,5,0,5,7),
                row.names = c("r1","r2","r3","r4","r5","r6"))

cMin <- apply(x, MARGIN = 2, FUN = min)
cMax <- apply(x, MARGIN = 2, FUN = max)

sweep(x, MARGIN = 2, STATS = cMin, FUN = "-") %>%
  sweep(., MARGIN = 2, STATS = (cMax - cMin), FUN = "/")

    c1   c2    c3        c4    c5    c6
r1 0.0 0.50 0.750 0.4444444 0.375 0.250
r2 0.5 0.75 0.875 0.0000000 1.000 1.000
r3 1.0 1.00 1.000 1.0000000 0.000 0.625
r4 0.5 0.00 0.750 0.1111111 0.875 0.000
r5 0.0 0.25 0.000 0.5555556 0.375 0.625
r6 1.0 0.50 0.625 0.0000000 0.750 0.875

【讨论】:

    【解决方案3】:

    正如我从解决方案中看到的那样,它的目标是将每列线性缩放到 0 到 1 的范围,最小值映射到 0,最大值映射到 1。

    在一行中,无需计算cMincMax

    apply(x, 2, 
          function(each_col) (each_col - min(each_col))/diff(range(each_col)))
    
    # c1   c2    c3        c4    c5    c6
    # r1 0.0 0.50 0.750 0.4444444 0.375 0.250
    # r2 0.5 0.75 0.875 0.0000000 1.000 1.000
    # r3 1.0 1.00 1.000 1.0000000 0.000 0.625
    # r4 0.5 0.00 0.750 0.1111111 0.875 0.000
    # r5 0.0 0.25 0.000 0.5555556 0.375 0.625
    # r6 1.0 0.50 0.625 0.0000000 0.750 0.875
    

    【讨论】:

      【解决方案4】:

      我们可以复制 'cMin' 和 'cMax' 并进行计算

      (mat - cMin[col(mat)])/(cMax[col(mat)] - cMin[col(mat)])
      #    c1   c2    c3        c4    c5    c6
      #r1 0.0 0.50 0.750 0.4444444 0.375 0.250
      #r2 0.5 0.75 0.875 0.0000000 1.000 1.000
      #r3 1.0 1.00 1.000 1.0000000 0.000 0.625
      #r4 0.5 0.00 0.750 0.1111111 0.875 0.000
      #r5 0.0 0.25 0.000 0.5555556 0.375 0.625
      #r6 1.0 0.50 0.625 0.0000000 0.750 0.875
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-04-23
        • 2018-03-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-27
        • 1970-01-01
        相关资源
        最近更新 更多