สร้างมาตรฐานและปรับขนาดแต่ละคอลัมน์ของทุกองค์ประกอบในรายการ

ฉันมีรายการดาต้าเฟรม 5 รายการดังนี้:

mydf <- data.frame(x=c(1:5), y=c(21:25),z=rnorm(1:5), p=rnorm(2:6), f=rnorm(3:7))
mylist <- rep(list(mydf),5)
names(mylist) <-c("2006-01-01","2006-01-02","2006-01-03","2006-01-04","2006-01-05") 

ฉันยังมีสูตร 3 ขั้นตอนและโค้ดต่อไปนี้ที่ฉันรวบรวม:

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

ขั้นตอนที่ 1 - รหัสสำหรับสิ่งนี้จะเป็นดังนี้ ซึ่งจะต้องคำนวณสำหรับทุกแถวของคอลัมน์เดียวกัน ถ้า x เป็นองค์ประกอบของ "z" , "f" หรือ "p" แล้ว:

z = x - mean(column))/sd(column)

2 - ปรับสเกล z คะแนนจาก 0 โดยใช้ค่าจากขั้นตอนที่ 1

rz = abs(min(z)) + z

3 - ปรับสเกลคะแนน RZ จากขั้นตอนที่ 2 โดยให้อยู่ระหว่าง 0 ถึง 1

mrz = rz/max(rz)

ฉันต้องใช้สูตรนี้ กับคอลัมน์ "z", "p", "f" เท่านั้น ด้วย objective_col <- colnames(mylist$'2006-01-05'[,3:5]) ในทุกองค์ประกอบของ mylist โดยใช้ apply , sapply, lapply หรือการวนซ้ำประเภทอื่น:

มันอาจจะมีลักษณะดังนี้:

lapply(mylist, FUN = function(x) .......)

ผลลัพธ์ควรอยู่ในเค้าโครงและรูปแบบเดียวกันกับ mydf ทั้งหมดจัดเก็บไว้ใน mylist2 <- list()

ฉันจะอัปเดตสิ่งนี้ต่อไปเมื่อมีความคืบหน้ามากขึ้น ฉันยังคงเรียนรู้วิธีใช้ลูปและฟังก์ชันต่างๆ อยู่.. ขอบคุณทุกคนที่สามารถให้ข้อมูลบางส่วนได้


person Alex Bădoi    schedule 24.08.2015    source แหล่งที่มา
comment
คุณจะกำหนด แถว z, p, f ได้อย่างไร? ทั้งหมดที่ฉันเห็นคือคอลัมน์ คุณมีตัวแปรอื่นที่กำหนดชุดย่อยเหล่านี้หรือเป็นเพียงการพิมพ์ผิด   -  person Alex W    schedule 25.08.2015
comment
มันเป็นการพิมพ์ผิด ตอนนี้ไปแล้ว   -  person Alex Bădoi    schedule 25.08.2015


คำตอบ (1)


person    schedule
comment
คุณควรจะสามารถใช้ lapply แทน apply(...,2,FUN) - person thelatemail; 25.08.2015
comment
แน่นอนว่าใช้งานได้ ... lapply(x[[c("z", "p", "f")]], function(y) ... เหมือนข้างบน - person Alex W; 25.08.2015
comment
ฉันยังดูฟังก์ชั่น 'สเกล' ก่อนหน้านี้ด้วย มันเป็นตัวแทนอย่างแน่นอน (x-μ)/σ ? สูตรไม่แสดงในเอกสารประกอบ ดังนั้นฉันจึงคิดว่าจะใช้เส้นทางที่ปลอดภัยกว่านี้ ขอขอบคุณสำหรับความช่วยเหลือ. ดูดี. - person Alex Bădoi; 25.08.2015
comment
ในทางเทคนิคแล้ว \mu และ \sigma ไม่ใช่พารามิเตอร์ที่ไม่รู้จัก หากคุณทราบคุณค่าของมัน (จากประชากร) คุณสามารถใช้มันได้ scale() ใช้ MLE สำหรับ \mu, \sigma (เช่น ค่าเฉลี่ยตัวอย่างและค่าเบี่ยงเบนมาตรฐานตัวอย่าง - person Alex W; 25.08.2015
comment
@AlexBădoi - ให้ผลลัพธ์เดียวกัน - ทดสอบ: all.equal(c(scale(1:10)),((1:10) - mean(1:10))/sd(1:10)) - person thelatemail; 25.08.2015
comment
@Alex - ดูเหมือนว่าคุณจะรวม 2 ขั้นตอนสุดท้ายไว้ในบรรทัดเดียวเช่นนั้น return((y2 + abs(min(y2))) / max(y2)) y2 สุดท้าย -› max(y2) โค้ดของคุณปรับขนาดจาก 0 หรือไม่ ขั้นตอนสุดท้ายของสูตรของฉันใช้ค่า Z ที่ปรับขนาดแล้ว จะถูกไหมถ้าเราหารด้วย ((max(y2)+min(y2)) ? - person Alex Bădoi; 25.08.2015
comment
จริงๆ แล้ว ((max(y2)+min(y2)) จะส่งกลับเพียง max ของ y2 ซึ่งเป็นคะแนน z ลบ min อาจจะหารด้วย max(y2 + abs(min(y2))) - person Alex Bădoi; 25.08.2015
comment
@ AlexBădoi ฉันขอแนะนำให้คุณทำตามขั้นตอนทีละคอลัมน์สำหรับคอลัมน์เดียว มันจะมีประโยชน์สำหรับคุณในการพัฒนาสัญชาตญาณเพื่อให้สามารถเข้าใจว่าโค้ดกำลังทำอะไรอยู่โดยไม่ต้องรัน... นั่นคือวิธีการเรียนรู้ - person Alex W; 25.08.2015