การคำนวณอันดับไทล์ไทล์ใน R [ปิด]


18

ฉันจะเพิ่มตัวแปรใหม่ลงในกรอบข้อมูลซึ่งจะเป็นเปอร์เซนต์ไทล์ของตัวแปรตัวใดตัวหนึ่งได้อย่างไร ฉันสามารถทำสิ่งนี้ใน Excel ได้อย่างง่ายดาย แต่ฉันต้องการทำอย่างนั้นในอาร์

ขอบคุณ

คำตอบ:


27

เมื่อกำหนดเวกเตอร์ของค่าข้อมูลดิบฟังก์ชันแบบง่าย ๆ อาจดูเหมือน

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))

3
1. ฟังก์ชั่นของคุณไม่ได้เลียนแบบpercentrankฟังก์ชั่นของ Excel ซึ่งดี (+1) เนื่องจากฟังก์ชันหลังให้ผลลัพธ์ที่ "แปลก" (ดูการเปรียบเทียบของฉัน) 2. ฉันจะไม่ตั้งชื่อกรอบข้อมูลdfเพราะdfเป็นฟังก์ชัน R (ความหนาแน่นของการแจกแจงแบบ F ดู?df)
Bernd Weiss

1
@Bernd ขอบคุณ (1) มีฟังก์ชั่นในตัวสำหรับการคำนวณ PR ในแพ็คเกจ psychometrics ต่างๆ ฉันคิดว่าฉันคว้าอันนี้จากCTTแพ็คเกจเมื่อไม่นานมานี้ ฉันไม่ได้ตรวจสอบกับ Excel เพราะฉันไม่มี / ใช้งาน เกี่ยวกับ (2) ฉันดูเหมือนจะลืมเรื่องนี้เสมอ! ไปด้วยmy.*(วิธี Perl) :-)
chl

@chl ทำไมtruncต้องมี? ดูเหมือนว่าอันดับจะกลับเป็นจำนวนเต็มอยู่ดี
Tyler Rinker

1
@Tyler Nope ในกรณีที่มีความสัมพันธ์เป็นrank()ค่าเริ่มต้นที่จะรับค่าเฉลี่ยของค่าผูก (cf. ties.method = c("average",...))
chl

8

ถ้า 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


1 - (อันดับ / ขนาด) ให้คุณเหมือนกับ excel percentilerank
user333

ฉันได้รับสิ่งนี้จากoffice.microsoft.com
Nick Sabbe

ตัวแก้ไขที่ไม่ระบุชื่อ (พยายาม) พยายามเพิ่มความคิดเห็นต่อไปนี้: "ฟังก์ชั่นที่ดี แต่บางครั้งน่าเสียดายที่ RLE อาจส่งคืนเวกเตอร์ของlength < length(dfr$myvar)"
gung - Reinstate Monica

1

ปัญหากับคำตอบที่นำเสนอคือมันจะไม่ทำงานอย่างถูกต้องเมื่อคุณมี 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))))]
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.