ฉันจะเพิ่มตัวแปรใหม่ลงในกรอบข้อมูลซึ่งจะเป็นเปอร์เซนต์ไทล์ของตัวแปรตัวใดตัวหนึ่งได้อย่างไร ฉันสามารถทำสิ่งนี้ใน Excel ได้อย่างง่ายดาย แต่ฉันต้องการทำอย่างนั้นในอาร์
ขอบคุณ
ฉันจะเพิ่มตัวแปรใหม่ลงในกรอบข้อมูลซึ่งจะเป็นเปอร์เซนต์ไทล์ของตัวแปรตัวใดตัวหนึ่งได้อย่างไร ฉันสามารถทำสิ่งนี้ใน Excel ได้อย่างง่ายดาย แต่ฉันต้องการทำอย่างนั้นในอาร์
ขอบคุณ
คำตอบ:
เมื่อกำหนดเวกเตอร์ของค่าข้อมูลดิบฟังก์ชันแบบง่าย ๆ อาจดูเหมือน
perc.rank <- function(x, xo) length(x[x <= xo])/length(x)*100
ซึ่งx0
เป็นค่าที่เราต้องการลำดับผลที่ได้รับเวกเตอร์x
ตามข้อเสนอแนะเกี่ยวกับR-เขียนบล็อก
อย่างไรก็ตามมันอาจจะเป็นเวกเตอร์ได้อย่างง่ายดาย
perc.rank <- function(x) trunc(rank(x))/length(x)
ซึ่งมีข้อดีคือไม่ต้องผ่านแต่ละค่า ดังนั้นนี่คือตัวอย่างการใช้งาน:
my.df <- data.frame(x=rnorm(200))
my.df <- within(my.df, xr <- perc.rank(x))
CTT
แพ็คเกจเมื่อไม่นานมานี้ ฉันไม่ได้ตรวจสอบกับ Excel เพราะฉันไม่มี / ใช้งาน เกี่ยวกับ (2) ฉันดูเหมือนจะลืมเรื่องนี้เสมอ! ไปด้วยmy.*
(วิธี Perl) :-)
trunc
ต้องมี? ดูเหมือนว่าอันดับจะกลับเป็นจำนวนเต็มอยู่ดี
rank()
ค่าเริ่มต้นที่จะรับค่าเฉลี่ยของค่าผูก (cf. ties.method = c("average",...)
)
ถ้า data.frame ดั้งเดิมของคุณถูกเรียกใช้dfr
และตัวแปรที่น่าสนใจเรียกว่าmyvar
คุณสามารถใช้dfr$myrank<-rank(dfr$myvar)
สำหรับการจัดอันดับปกติหรือdfr$myrank<-rank(dfr$myvar)/length(myvar)
การจัดอันดับเปอร์เซ็นต์
โอ้ดี หากคุณต้องการมันด้วยวิธีของ Excel (อาจไม่ใช่วิธีที่ง่ายที่สุด แต่ฉันสนุกกับการใช้ฟังก์ชั่นใหม่ (กับฉัน) และหลีกเลี่ยงการวนซ้ำ):
percentilerank<-function(x){
rx<-rle(sort(x))
smaller<-cumsum(c(0, rx$lengths))[seq(length(rx$lengths))]
larger<-rev(cumsum(c(0, rev(rx$lengths))))[-1]
rxpr<-smaller/(smaller+larger)
rxpr[match(x, rx$values)]
}
ดังนั้นตอนนี้คุณสามารถใช้ dfr$myrank<-percentilerank(dfr$myvar)
HTH
length < length(dfr$myvar)
"
ปัญหากับคำตอบที่นำเสนอคือมันจะไม่ทำงานอย่างถูกต้องเมื่อคุณมี NAs
ในกรณีนี้ความเป็นไปได้อื่น (ได้รับแรงบันดาลใจจากฟังก์ชั่นจาก chl ♦) คือ:
perc.rank <- function(x) trunc(rank(x,na.last = NA))/sum(!is.na(x))
quant <- function (x, p.ile) {
x[which.min(x = abs(perc.rank(x-(p.ile/100))))]
}
ที่นี่ x คือเวกเตอร์ของค่าและ p.ile คือเปอร์เซ็นต์ไทล์ตามลำดับ 2.5 เปอร์เซนต์ตามลำดับของcoef.mat (โดยพลการ) อาจคำนวณได้โดย:
quant(coef.mat[,3], 2.5)
[1] 0.00025
หรือเป็นฟังก์ชั่นเดียว:
quant <- function (x, p.ile) {
perc.rank <- trunc(rank(x,na.last = NA))/sum(!is.na(x))
x = na.omit(x)
x[which.min(x = abs(perc.rank(x-(p.ile/100))))]
}
percentrank
ฟังก์ชั่นของ Excel ซึ่งดี (+1) เนื่องจากฟังก์ชันหลังให้ผลลัพธ์ที่ "แปลก" (ดูการเปรียบเทียบของฉัน) 2. ฉันจะไม่ตั้งชื่อกรอบข้อมูลdf
เพราะdf
เป็นฟังก์ชัน R (ความหนาแน่นของการแจกแจงแบบ F ดู?df
)