簡體   English   中英

R矩陣應用功能

[英]R matrix apply function with

我有以下示例矩陣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函數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函數嗎?

從矩陣中減去向量時,由於矩陣的存儲機制和回收規則,向量按列對齊。 因此,您可以轉置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
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

從解決方案中我看到,其目標是使每一列線性地縮放到0到1的范圍,最小值映射到0,最大值映射到1。

cMin一行,而無需計算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

我們可以復制“ 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM