สร้างคอลัมน์ข้อมูลมาตรฐานใน R


209

ฉันมีชุดข้อมูลที่เรียกว่าspamซึ่งมี 58 คอลัมน์และประมาณ 3,500 แถวของข้อมูลที่เกี่ยวข้องกับข้อความสแปม

ฉันวางแผนที่จะใช้การถดถอยเชิงเส้นบางส่วนในชุดข้อมูลนี้ในอนาคต แต่ฉันต้องการทำการประมวลผลล่วงหน้าล่วงหน้าและสร้างมาตรฐานคอลัมน์ให้มีค่าเฉลี่ยศูนย์และความแปรปรวนของหน่วยเป็นศูนย์

ฉันได้รับการบอกวิธีที่ดีที่สุดในการทำเรื่องนี้กับ R ดังนั้นฉันอยากถามว่าฉันจะทำให้ปกติกับ R ได้อย่างไร ฉันโหลดข้อมูลเรียบร้อยแล้วและฉันกำลังมองหาแพ็คเกจหรือวิธีการบางอย่างเพื่อทำงานนี้

คำตอบ:


533

ฉันต้องสมมติว่าคุณตั้งใจจะบอกว่าคุณต้องการค่าเฉลี่ยเป็น 0 และส่วนเบี่ยงเบนมาตรฐาน 1 หากข้อมูลของคุณอยู่ใน dataframe และคอลัมน์ทั้งหมดเป็นตัวเลขคุณสามารถเรียกscaleฟังก์ชันบนข้อมูลเพื่อทำสิ่งที่คุณต้องการ

dat <- data.frame(x = rnorm(10, 30, .2), y = runif(10, 3, 5))
scaled.dat <- scale(dat)

# check that we get mean of 0 and sd of 1
colMeans(scaled.dat)  # faster version of apply(scaled.dat, 2, mean)
apply(scaled.dat, 2, sd)

การใช้ฟังก์ชั่นในตัวเป็นสิ่งที่ดีงาม ชอบแมวตัวนี้:

ป้อนคำอธิบายรูปภาพที่นี่


24
ใช่ความผิดพลาดของฉันฉันหมายถึง 0 หมายความว่า และนั่นก็เป็นแมวที่ดีงาม
Hoser

8
+1 ใช้สามารถช้าเหมือนแมวอ้วนนี้ :) (colMeans นี่)
agstudy

1
@agstudy ยุติธรรมเพียงพอ ฉันควรใช้ colMeans / colSums ต่อไปเรื่อย ๆ ฉันเดาว่าฉันจะไม่คิดนอกเสียจากว่าฉันจะอยู่ในสถานการณ์ที่มันสำคัญ ...
Dason

137
ไซต์นี้ต้องการแมวมากกว่า +1
LoveMeow

35
คำเตือน: สเกลเปลี่ยนเฟรมข้อมูลเป็นเมทริกซ์ด้วย
Julian Karls

88

เมื่อตระหนักว่าคำถามนั้นเก่าแล้วและมีคำตอบหนึ่งคำตอบฉันจะให้คำตอบอีกหนึ่งสำหรับการอ้างอิง

scaleจะถูก จำกัด โดยความเป็นจริงที่ว่ามันชั่งตัวแปรทั้งหมด วิธีการแก้ปัญหาด้านล่างอนุญาตให้ปรับขนาดเฉพาะชื่อตัวแปรเฉพาะในขณะที่รักษาตัวแปรอื่น ๆ ไม่เปลี่ยนแปลง (และสามารถสร้างชื่อตัวแปรแบบไดนามิก):

library(dplyr)

set.seed(1234)
dat <- data.frame(x = rnorm(10, 30, .2), 
                  y = runif(10, 3, 5),
                  z = runif(10, 10, 20))
dat

dat2 <- dat %>% mutate_at(c("y", "z"), ~(scale(.) %>% as.vector))
dat2

ซึ่งให้ฉันนี้:

> dat
          x        y        z
1  29.75859 3.633225 14.56091
2  30.05549 3.605387 12.65187
3  30.21689 3.318092 13.04672
4  29.53086 3.079992 15.07307
5  30.08582 3.437599 11.81096
6  30.10121 4.621197 17.59671
7  29.88505 4.051395 12.01248
8  29.89067 4.829316 12.58810
9  29.88711 4.662690 19.92150
10 29.82199 3.091541 18.07352

และ

> dat2 <- dat %>% mutate_at(c("y", "z"), ~(scale(.) %>% as.vector))
> dat2
          x          y           z
1  29.75859 -0.3004815 -0.06016029
2  30.05549 -0.3423437 -0.72529604
3  30.21689 -0.7743696 -0.58772361
4  29.53086 -1.1324181  0.11828039
5  30.08582 -0.5946582 -1.01827752
6  30.10121  1.1852038  0.99754666
7  29.88505  0.3283513 -0.94806607
8  29.89067  1.4981677 -0.74751378
9  29.88711  1.2475998  1.80753470
10 29.82199 -1.1150515  1.16367556

แก้ไข 1 (2016) : พูดถึงความคิดเห็นของจูเลียน: ผลลัพธ์ของscaleเมทริกซ์ Nx1 ดังนั้นเราควรเพิ่มการas.vectorแปลงเมทริกซ์กลับไปเป็นประเภทเวกเตอร์ ขอบคุณจูเลียน!

แก้ไข 2 (2019) : การอ้างอิงความคิดเห็นของ Duccio A. : สำหรับ dplyr ล่าสุด (เวอร์ชั่น 0.8) คุณจำเป็นต้องเปลี่ยน dplyr :: funcs with list, likedat %>% mutate_each_(list(~scale(.) %>% as.vector), vars=c("y","z"))

แก้ไข 3 (2020) : ขอขอบคุณที่ @mj_whales: mutate_atการแก้ปัญหาเก่าจะเลิกใช้แล้วและตอนนี้เราจำเป็นต้องใช้


วิธีนี้ทำงานได้อย่างสมบูรณ์แบบโดยเฉพาะเมื่อฉันมีการรวมกันของตัวแปรเด็ดขาดและตัวเลข ฉันมีคำถามหนึ่งข้อว่าตัวดำเนินการนี้หมายถึง "%>%" อย่างไร
nooshinha

9
@ weber85 มันเป็นตัวดำเนินการ "ไปป์" (จากการเขียนโปรแกรมฟังก์ชั่น) แทนการเขียนมันจะดูดีกว่าถ้ามีใครเขียนf(g(x)) x %>% g %>% fในคำอื่น ๆเป็นเพียงdat %>% mutate_each_(funs(scale),vars=c("y","z")) mutate_each_(dat,funs(scale),vars=c("y","z"))ผู้ปฏิบัติงานช่วยได้มากเมื่อโซ่ยาวมากเนื่องจากf(g(h(i(j(x)))))อ่านได้ยาก
akhmed

การใช้วิธีการนี้คอลัมน์ที่ใช้กับสเกลจะถูกถ่ายโอนจากเวกเตอร์ (คลาสตัวเลข) ไปยังเมทริกซ์ Nx1 สิ่งนี้อาจ (และในกรณีของฉันทำ) ทำให้เกิดข้อผิดพลาดบางอย่างในแพ็คเกจที่ถือว่าแต่ละคอลัมน์ของ data.frame เป็นเวกเตอร์
Julian Karls

2
สำหรับล่าสุดdplyr(เวอร์ชั่น 0.8) คุณต้องเปลี่ยนdplyr::funcsด้วยlistเช่นdat %>% mutate_each_(list(~scale(.) %>% as.vector), vars=c("y","z"))
Duccio A

2
mutate_each_()เลิกใช้แล้ว คุณสามารถใช้mutate_at()แทน วิธีใหม่ในการดำเนินการคือ:dat2 <- dat %>% mutate_at(c("y", "z"), scale)
mj_whales

60

นี่คือ 3 ปี ยังฉันรู้สึกว่าฉันต้องเพิ่มต่อไปนี้:

การนอร์มัลไลซ์ที่พบมากที่สุดคือการแปลง zซึ่งคุณลบค่าเฉลี่ยและหารด้วยค่าเบี่ยงเบนมาตรฐานของตัวแปรของคุณ ผลลัพธ์จะมีค่าเฉลี่ย = 0 และ sd = 1

เพื่อที่คุณไม่จำเป็นต้องมีแพคเกจใด ๆ

zVar <- (myVar - mean(myVar)) / sd(myVar)

แค่นั้นแหละ.


ทั้งหมดนี้เป็นวิธีที่ง่ายในการทำสิ่งนี้ ขอบคุณ
Pedro Neves

และทำให้การใช้มัน dplyr mutate(var = (var - mean(var))/sd(var))ง่ายมาก:
RobertMyles

แต่สามารถใช้เพื่อรับคะแนน z สำหรับตัวแปรสองตัวได้หรือไม่
lf_araujo

จะmyVar <- (zVar * sd(zVar)) + mean(zVar)ทำให้ปกติใช่ไหม?
Artur_Indio

4
@Artur_Indio newVar <- (zVar * sd(myVar)) + mean(myVar)เกือบ: คุณต้องใช้ค่าเฉลี่ย / sd ต้นฉบับ ในขณะที่คุณเขียนมันคุณจะคูณด้วยsd(zVar)=1และเพิ่มmean(zVar)=0ดังนั้นจะไม่มีการเปลี่ยนแปลง :)
random_forest_fanatic

24

แพ็คเกจ 'Caret' มีวิธีการประมวลผลข้อมูลล่วงหน้า (เช่นการจัดกึ่งกลางและการปรับขนาด) คุณสามารถใช้รหัสต่อไปนี้:

library(caret)
# Assuming goal class is column 10
preObj <- preProcess(data[, -10], method=c("center", "scale"))
newData <- predict(preObj, data[, -10])

รายละเอียดเพิ่มเติม: http://www.inside-r.org/node/86978


17

เมื่อฉันใช้วิธีแก้ปัญหาที่ระบุโดย Dason แทนที่จะได้รับ data frame ฉันได้เวกเตอร์ของตัวเลข (ค่าสเกลของ df ของฉัน)

ในกรณีที่ใครบางคนมีปัญหาเดียวกันคุณต้องเพิ่ม as.data.frame () ลงในโค้ดดังนี้:

df.scaled <- as.data.frame(scale(df))

ฉันหวังว่านี่จะเป็นประโยชน์สำหรับ ppl ที่มีปัญหาเดียวกัน!


ทางออกที่ดี! ในกรณีที่มีคนต้องการแยกคอลัมน์ออกจากการปรับสัดส่วนคุณสามารถทำได้เช่นนี้ train_dt[-24] <- scale(train_dt[-24]) โดยที่ "24" คือหมายเลขคอลัมน์ที่จะยกเว้น
NetEmmanuel

13

คุณสามารถทำให้ข้อมูลเป็นปกติได้อย่างง่ายดายโดยใช้ data ฟังก์ชั่น Normalization ใน clusterSim package มันมีวิธีการที่แตกต่างกันของการฟื้นฟูข้อมูล

    data.Normalization (x,type="n0",normalization="column")

ข้อโต้แย้ง

x
เวกเตอร์เมทริกซ์หรือประเภทชุดข้อมูล
ของการปรับสภาพ: n0 - โดยไม่มีการปรับสภาพ

n1 - มาตรฐาน ((x-mean) / sd)

n2 - มาตรฐานตำแหน่ง ((x-median) / mad)

n3 - หน่วย ((x-Mean) / พิสัย)

n3a - ตำแหน่งหน่วย ((x-median) / พิสัย)

n4 - หน่วยเป็นศูนย์โดยมีค่าต่ำสุดเป็นศูนย์ ((x-min) / พิสัย)

n5 - การทำให้เป็นมาตรฐานในช่วง <-1,1> ((x-mean) / max (abs (x-mean)))

n5a - การปรับสภาพตำแหน่งในช่วง <-1,1> ((x-median) / max (abs (x-median)))

n6 - การแปลงความฉลาดทาง (x / sd)

n6a - การแปลงความฉลาดทางตำแหน่ง (x / mad)

n7 - การแปลงความฉลาดทาง (x / พิสัย)

n8 - การแปลงความฉลาดทาง (x / สูงสุด)

n9 - การแปลงความฉลาดทาง (x / หมายถึง)

n9a - การแปลงความฉลาดทางตำแหน่ง (x / มัธยฐาน)

n10 - การแปลงความฉลาดทาง (x / ผลรวม)

n11 - การแปลงความฉลาดทาง (x / sqrt (SSQ))

n12 - การทำให้เป็นมาตรฐาน ((x-mean) / sqrt (sum ((x-mean) ^ 2)))

n12a - การปรับสภาพตำแหน่ง ((x-median) / sqrt (ผลรวม ((x-median) ^ 2))

n13 - การทำให้เป็นมาตรฐานโดยที่ศูนย์เป็นจุดศูนย์กลาง ((x-midrange) / (range / 2))

การทำให้เป็นมาตรฐาน
"คอลัมน์" - การทำให้เป็นมาตรฐานโดยตัวแปร, "แถว" - การทำให้เป็นมาตรฐานโดยวัตถุ


แพ็คเกจนี้ไม่สามารถใช้งานได้กับรุ่น R 3.4.3
JdP

11

ด้วยdplyrv0.7.4 ตัวแปรทั้งหมดสามารถถูกปรับอัตราส่วนโดยใช้mutate_all():

library(dplyr)
#> 
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#> 
#>     filter, lag
#> The following objects are masked from 'package:base':
#> 
#>     intersect, setdiff, setequal, union
library(tibble)

set.seed(1234)
dat <- tibble(x = rnorm(10, 30, .2), 
              y = runif(10, 3, 5),
              z = runif(10, 10, 20))

dat %>% mutate_all(scale)
#> # A tibble: 10 x 3
#>         x      y       z
#>     <dbl>  <dbl>   <dbl>
#>  1 -0.827 -0.300 -0.0602
#>  2  0.663 -0.342 -0.725 
#>  3  1.47  -0.774 -0.588 
#>  4 -1.97  -1.13   0.118 
#>  5  0.816 -0.595 -1.02  
#>  6  0.893  1.19   0.998 
#>  7 -0.192  0.328 -0.948 
#>  8 -0.164  1.50  -0.748 
#>  9 -0.182  1.25   1.81  
#> 10 -0.509 -1.12   1.16

ตัวแปรเฉพาะสามารถยกเว้นได้โดยใช้mutate_at():

dat %>% mutate_at(scale, .vars = vars(-x))
#> # A tibble: 10 x 3
#>        x      y       z
#>    <dbl>  <dbl>   <dbl>
#>  1  29.8 -0.300 -0.0602
#>  2  30.1 -0.342 -0.725 
#>  3  30.2 -0.774 -0.588 
#>  4  29.5 -1.13   0.118 
#>  5  30.1 -0.595 -1.02  
#>  6  30.1  1.19   0.998 
#>  7  29.9  0.328 -0.948 
#>  8  29.9  1.50  -0.748 
#>  9  29.9  1.25   1.81  
#> 10  29.8 -1.12   1.16

สร้างเมื่อ 2018-04-24 โดยแพ็คเกจ reprex (v0.2.0)


9

ถึงแม้ว่านี่จะเป็นคำถามเก่า แต่ก็มีความเกี่ยวข้องมาก! และฉันได้พบวิธีง่ายๆในการทำให้ปกติบางคอลัมน์โดยไม่ต้องใช้แพ็คเกจใด ๆ :

normFunc <- function(x){(x-mean(x, na.rm = T))/sd(x, na.rm = T)}

ตัวอย่างเช่น

x<-rnorm(10,14,2)
y<-rnorm(10,7,3)
z<-rnorm(10,18,5)
df<-data.frame(x,y,z)

df[2:3] <- apply(df[2:3], 2, normFunc)

คุณจะเห็นว่าคอลัมน์ y และ z ได้รับการทำให้เป็นมาตรฐาน ไม่จำเป็นต้องมีแพ็คเกจ :-)


8

สามารถใช้สเกลได้ทั้งเฟรมข้อมูลแบบเต็มและคอลัมน์เฉพาะ สำหรับคอลัมน์ที่ระบุสามารถใช้รหัสต่อไปนี้:

trainingSet[, 3:7] = scale(trainingSet[, 3:7]) # For column 3 to 7
trainingSet[, 8] = scale(trainingSet[, 8]) # For column 8 

เฟรมข้อมูลแบบเต็ม

trainingSet <- scale(trainingSet)

3

dplyrแพคเกจมีสองฟังก์ชั่นที่ทำเช่นนี้

> require(dplyr)

กลายพันธุ์เฉพาะmutate_at()คอลัมน์ของตารางข้อมูลคุณสามารถใช้ฟังก์ชั่น การกลายพันธุ์ทุกmutate_allคอลัมน์คุณสามารถใช้

ต่อไปนี้เป็นตัวอย่างสั้น ๆ สำหรับการใช้ฟังก์ชันเหล่านี้เพื่อสร้างมาตรฐานข้อมูล

กลายพันธุ์คอลัมน์ที่เฉพาะเจาะจง:

dt = data.table(a = runif(3500), b = runif(3500), c = runif(3500))
dt = data.table(dt %>% mutate_at(vars("a", "c"), scale)) # can also index columns by number, e.g., vars(c(1,3))

> apply(dt, 2, mean)
            a             b             c 
 1.783137e-16  5.064855e-01 -5.245395e-17 

> apply(dt, 2, sd)
        a         b         c 
1.0000000 0.2906622 1.0000000 

กลายพันธุ์คอลัมน์ทั้งหมด:

dt = data.table(a = runif(3500), b = runif(3500), c = runif(3500))
dt = data.table(dt %>% mutate_all(scale))

> apply(dt, 2, mean)
            a             b             c 
-1.728266e-16  9.291994e-17  1.683551e-16 

> apply(dt, 2, sd)
a b c 
1 1 1 

1

ก่อนที่ฉันจะพบกระทู้นี้ฉันมีปัญหาเดียวกัน ผมมีผู้ใช้ขึ้นอยู่กับประเภทคอลัมน์ดังนั้นฉันเขียนforห่วงจะผ่านพวกเขาและได้รับการจำเป็นคอลัมน์scale'd อาจมีวิธีที่ดีกว่าที่จะทำ แต่วิธีนี้แก้ไขปัญหาได้ดี:

 for(i in 1:length(colnames(df))) {
        if(class(df[,i]) == "numeric" || class(df[,i]) == "integer") {
            df[,i] <- as.vector(scale(df[,i])) }
        }

as.vectorเป็นส่วนหนึ่งที่จำเป็นเพราะจะเปิดออกscaleไม่เมทริกซ์ซึ่งมักจะไม่ได้สิ่งที่คุณต้องการที่จะมีในของคุณrownames x 1data.frame


0

ใช้แพ็คเกจ "recommenderlab" ดาวน์โหลดและติดตั้งแพ็คเกจ แพ็คเกจนี้มีคำสั่ง "Normalize" ในตัว นอกจากนี้ยังช่วยให้คุณสามารถเลือกหนึ่งในหลายวิธีในการทำให้ปกติเป็น 'ศูนย์' หรือ 'คะแนน Z' ทำตามตัวอย่างต่อไปนี้:

## create a matrix with ratings
m <- matrix(sample(c(NA,0:5),50, replace=TRUE, prob=c(.5,rep(.5/6,6))),nrow=5, ncol=10, dimnames = list(users=paste('u', 1:5, sep=&rdquo;), items=paste('i', 1:10, sep=&rdquo;)))

## do normalization
r <- as(m, "realRatingMatrix")
#here, 'centre' is the default method
r_n1 <- normalize(r) 
#here "Z-score" is the used method used
r_n2 <- normalize(r, method="Z-score")

r
r_n1
r_n2

## show normalized data
image(r, main="Raw Data")
image(r_n1, main="Centered")
image(r_n2, main="Z-Score Normalization")

1
คำตอบนี้ไม่ได้ตอบคำถาม
f0nzie

0

ปกติฟังก์ชั่นจากแพคเกจ BBMisc เป็นเครื่องมือที่เหมาะสมสำหรับฉันเพราะมันสามารถจัดการกับค่า NA

นี่คือวิธีการใช้งาน:

รับชุดข้อมูลต่อไปนี้

    ASR_API     <- c("CV",  "F",    "IER",  "LS-c", "LS-o")
    Human       <- c(NA,    5.8,    12.7,   NA, NA)
    Google      <- c(23.2,  24.2,   16.6,   12.1,   28.8)
    GoogleCloud <- c(23.3,  26.3,   18.3,   12.3,   27.3)
    IBM     <- c(21.8,  47.6,   24.0,   9.8,    25.3)
    Microsoft   <- c(29.1,  28.1,   23.1,   18.8,   35.9)
    Speechmatics    <- c(19.1,  38.4,   21.4,   7.3,    19.4)
    Wit_ai      <- c(35.6,  54.2,   37.4,   19.2,   41.7)
    dt     <- data.table(ASR_API,Human, Google, GoogleCloud, IBM, Microsoft, Speechmatics, Wit_ai)
> dt
   ASR_API Human Google GoogleCloud  IBM Microsoft Speechmatics Wit_ai
1:      CV    NA   23.2        23.3 21.8      29.1         19.1   35.6
2:       F   5.8   24.2        26.3 47.6      28.1         38.4   54.2
3:     IER  12.7   16.6        18.3 24.0      23.1         21.4   37.4
4:    LS-c    NA   12.1        12.3  9.8      18.8          7.3   19.2
5:    LS-o    NA   28.8        27.3 25.3      35.9         19.4   41.7

ค่าปกติได้รับเช่นนี้:

> dtn <- normalize(dt, method = "standardize", range = c(0, 1), margin = 1L, on.constant = "quiet")
> dtn
   ASR_API      Human     Google GoogleCloud         IBM  Microsoft Speechmatics      Wit_ai
1:      CV         NA  0.3361245   0.2893457 -0.28468670  0.3247336  -0.18127203 -0.16032655
2:       F -0.7071068  0.4875320   0.7715885  1.59862532  0.1700986   1.55068347  1.31594762
3:     IER  0.7071068 -0.6631646  -0.5143923 -0.12409420 -0.6030768   0.02512682 -0.01746131
4:    LS-c         NA -1.3444981  -1.4788780 -1.16064578 -1.2680075  -1.24018782 -1.46198764
5:    LS-o         NA  1.1840062   0.9323361 -0.02919864  1.3762521  -0.15435044  0.32382788

ที่วิธีการคำนวณด้วยมือเพียงไม่สนใจ colmuns ที่มี NAs:

> dt %>% mutate(normalizedHuman = (Human - mean(Human))/sd(Human)) %>% 
+ mutate(normalizedGoogle = (Google - mean(Google))/sd(Google)) %>% 
+ mutate(normalizedGoogleCloud = (GoogleCloud - mean(GoogleCloud))/sd(GoogleCloud)) %>% 
+ mutate(normalizedIBM = (IBM - mean(IBM))/sd(IBM)) %>% 
+ mutate(normalizedMicrosoft = (Microsoft - mean(Microsoft))/sd(Microsoft)) %>% 
+ mutate(normalizedSpeechmatics = (Speechmatics - mean(Speechmatics))/sd(Speechmatics)) %>% 
+ mutate(normalizedWit_ai = (Wit_ai - mean(Wit_ai))/sd(Wit_ai))
  ASR_API Human Google GoogleCloud  IBM Microsoft Speechmatics Wit_ai normalizedHuman normalizedGoogle
1      CV    NA   23.2        23.3 21.8      29.1         19.1   35.6              NA        0.3361245
2       F   5.8   24.2        26.3 47.6      28.1         38.4   54.2              NA        0.4875320
3     IER  12.7   16.6        18.3 24.0      23.1         21.4   37.4              NA       -0.6631646
4    LS-c    NA   12.1        12.3  9.8      18.8          7.3   19.2              NA       -1.3444981
5    LS-o    NA   28.8        27.3 25.3      35.9         19.4   41.7              NA        1.1840062
  normalizedGoogleCloud normalizedIBM normalizedMicrosoft normalizedSpeechmatics normalizedWit_ai
1             0.2893457   -0.28468670           0.3247336            -0.18127203      -0.16032655
2             0.7715885    1.59862532           0.1700986             1.55068347       1.31594762
3            -0.5143923   -0.12409420          -0.6030768             0.02512682      -0.01746131
4            -1.4788780   -1.16064578          -1.2680075            -1.24018782      -1.46198764
5             0.9323361   -0.02919864           1.3762521            -0.15435044       0.32382788

(ปกติมนุษย์ทำรายการของ NAs ... )

เกี่ยวกับการเลือกคอลัมน์เฉพาะสำหรับการคำนวณสามารถใช้วิธีการทั่วไปเช่นนี้:

data_vars <- df_full %>% dplyr::select(-ASR_API,-otherVarNotToBeUsed)
meta_vars <- df_full %>% dplyr::select(ASR_API,otherVarNotToBeUsed)
data_varsn <- normalize(data_vars, method = "standardize", range = c(0, 1), margin = 1L, on.constant = "quiet")
dtn <- cbind(meta_vars,data_varsn)

0

@BBKim ให้คำตอบที่ดีที่สุด แต่ก็สามารถทำให้สั้นลงได้ ฉันแปลกใจที่ไม่มีใครมากับมันเลย

dat <- data.frame(x = rnorm(10, 30, .2), y = runif(10, 3, 5)) dat <- apply(dat, 2, function(x) (x - mean(x)) / sd(x))

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.