ฉันมีเวกเตอร์ขนาดใหญ่ที่มีค่าอยู่สองสามNA
ค่าและฉันพยายามหาค่าสูงสุดในเวกเตอร์นั้น (เวกเตอร์นั้นเป็นตัวเลขทั้งหมด) แต่ฉันทำไม่ได้เพราะNA
ค่า
ฉันจะลบNA
ค่าต่างๆเพื่อให้สามารถคำนวณค่าสูงสุดได้อย่างไร
ฉันมีเวกเตอร์ขนาดใหญ่ที่มีค่าอยู่สองสามNA
ค่าและฉันพยายามหาค่าสูงสุดในเวกเตอร์นั้น (เวกเตอร์นั้นเป็นตัวเลขทั้งหมด) แต่ฉันทำไม่ได้เพราะNA
ค่า
ฉันจะลบNA
ค่าต่างๆเพื่อให้สามารถคำนวณค่าสูงสุดได้อย่างไร
คำตอบ:
พยายามที่?max
คุณจะเห็นว่ามันจริงมีอาร์กิวเมนต์ชุดโดยค่าเริ่มต้นna.rm =
FALSE
(นั่นคือเริ่มต้นที่พบบ่อยสำหรับฟังก์ชั่น R อื่น ๆ อีกมากมายรวมทั้งsum()
, mean()
ฯลฯ )
การตั้งค่าna.rm=TRUE
ทำได้เพียงแค่สิ่งที่คุณต้องการ:
d <- c(1, 100, NA, 10)
max(d, na.rm=TRUE)
หากคุณต้องการที่จะลบทั้งหมดของNA
ใช้สำนวนนี้แทน:
d <- d[!is.na(d)]
หมายเหตุสุดท้าย: ฟังก์ชั่นอื่น ๆ (เช่นtable()
, lm()
และsort()
) มีNA
อาร์กิวเมนต์ที่เกี่ยวข้องซึ่งใช้ชื่อต่างกัน (และเสนอตัวเลือกต่าง ๆ ) ดังนั้นหากNA
คุณทำให้เกิดปัญหาในการเรียกใช้ฟังก์ชันมันก็คุ้มค่าที่จะตรวจสอบวิธีแก้ปัญหาในตัวระหว่างข้อโต้แย้งของฟังก์ชัน ฉันพบว่ามักจะมีอยู่แล้วที่นั่น
max()
(เช่นเมื่อดำเนินการmax(c(NA, NA)
) ส่วนตัวแล้วฉันคิดว่าพฤติกรรมของมันสมเหตุสมผล ฉันคาดหวังว่ามันจะถูกสร้างขึ้นแบบนั้นเพื่อให้คุณได้รับผลลัพธ์ที่คาดหวังเมื่อทำสิ่งต่าง ๆ เช่นa <- c(NA, NA); b <- 1:4; max(c(max(a, na.rm = TRUE), max(b, na.rm = TRUE)))
NA
สิ่งอำนวยความสะดวกR-like- handling ในแพ็คเกจNumPy ที่ยอดเยี่ยมของ Python )
NA
s ทั้งหมดออกจากเวกเตอร์ของNA
s คุณจะคาดหวังว่าเวกเตอร์เปล่าไม่ใช่-∞
na.omit
ฟังก์ชั่นเป็นสิ่งที่มากของการปฏิบัติถดถอยใช้ภายใน:
vec <- 1:1000
vec[runif(200, 1, 1000)] <- NA
max(vec)
#[1] NA
max( na.omit(vec) )
#[1] 1000
?max
แสดงให้คุณเห็นว่ามีพารามิเตอร์พิเศษna.rm
ที่คุณสามารถตั้งค่าTRUE
ได้
นอกจากนั้นหากคุณต้องการที่จะลบออกจริงๆNA
เพียงใช้สิ่งที่ชอบ:
myvec[!is.na(myvec)]
na.omit
ยังมีวิธีการดาต้าเฟรมดังนั้นจึงเป็นเรื่องทั่วไปมากขึ้น
max(vector, na.rm = TRUE)
คุณสามารถโทรหา โดยทั่วไปคุณสามารถใช้na.omit()
ฟังก์ชั่น
ในกรณีที่มีคนใหม่ R ต้องการคำตอบที่ง่ายสำหรับคำถามเดิม
ฉันจะลบค่า NA ออกจากเวกเตอร์ได้อย่างไร
นี่มันคือ:
สมมติว่าคุณมีเวกเตอร์foo
ดังต่อไปนี้:
foo = c(1:10, NA, 20:30)
การวิ่งlength(foo)
ให้ 22
nona_foo = foo[!is.na(foo)]
length(nona_foo)
คือ 21 เนื่องจากค่า NA ถูกลบออก
อย่าลืมis.na(foo)
ส่งคืนเมทริกซ์บูลีนดังนั้นการสร้างดัชนีfoo
โดยตรงกันข้ามกับค่านี้จะให้องค์ประกอบทั้งหมดที่ไม่ใช่ NA
ใช้discard
จากpurrr (ใช้ได้กับรายการและเวกเตอร์)
discard(v, is.na)
ประโยชน์คือใช้งานง่าย หรือใช้ฟังก์ชันการตั้งค่าย่อยในตัว[
:
v %>% discard(is.na)
v %>% `[`(!is.na(.))
โปรดทราบว่าna.omit
ไม่สามารถใช้ได้กับรายการ:
> x <- list(a=1, b=2, c=NA)
> na.omit(x)
$a
[1] 1
$b
[1] 2
$c
[1] NA
ฉันวิ่งมาตรฐานอย่างรวดเร็วเปรียบเทียบทั้งสองbase
วิธีการและปรากฎว่าจะเร็วกว่าx[!is.na(x)]
na.omit
ผู้ใช้qwr
แนะนำฉันลองpurrr::dicard
ด้วย - สิ่งนี้กลายเป็นช้าลงอย่างมาก (แม้ว่าฉันจะแสดงความคิดเห็นอย่างมีความสุขกับการติดตั้งและทดสอบ!)
microbenchmark::microbenchmark(
purrr::map(airquality,function(x) {x[!is.na(x)]}),
purrr::map(airquality,na.omit),
purrr::map(airquality, ~purrr::discard(.x, .p = is.na)),
times = 1e6)
Unit: microseconds
expr min lq mean median uq max neval cld
purrr::map(airquality, function(x) { x[!is.na(x)] }) 66.8 75.9 130.5643 86.2 131.80 541125.5 1e+06 a
purrr::map(airquality, na.omit) 95.7 107.4 185.5108 129.3 190.50 534795.5 1e+06 b
purrr::map(airquality, ~purrr::discard(.x, .p = is.na)) 3391.7 3648.6 5615.8965 4079.7 6486.45 1121975.4 1e+06 c
สำหรับการอ้างอิงต่อไปนี้เป็นการทดสอบแบบดั้งเดิมของx[!is.na(x)]
vs na.omit
:
microbenchmark::microbenchmark(
purrr::map(airquality,function(x) {x[!is.na(x)]}),
purrr::map(airquality,na.omit),
times = 1000000)
Unit: microseconds
expr min lq mean median uq max neval cld
map(airquality, function(x) { x[!is.na(x)] }) 53.0 56.6 86.48231 58.1 64.8 414195.2 1e+06 a
map(airquality, na.omit) 85.3 90.4 134.49964 92.5 104.9 348352.8 1e+06 b
purrr:discard
-Inf
สำหรับd
NA ทั้งหมด