สมมติว่าคุณมี data.frame เช่นนี้:
x <- data.frame(v1=1:20,v2=1:20,v3=1:20,v4=letters[1:20])
คุณจะเลือกเฉพาะคอลัมน์เหล่านั้นใน x ที่เป็นตัวเลขได้อย่างไร
สมมติว่าคุณมี data.frame เช่นนี้:
x <- data.frame(v1=1:20,v2=1:20,v3=1:20,v4=letters[1:20])
คุณจะเลือกเฉพาะคอลัมน์เหล่านั้นใน x ที่เป็นตัวเลขได้อย่างไร
คำตอบ:
แก้ไข: อัปเดตเพื่อหลีกเลี่ยงการใช้คำแนะนำที่ไม่ดี sapply
ไม่ดี
เนื่องจาก data frame เป็นรายการเราจึงสามารถใช้ฟังก์ชัน list-apply:
nums <- unlist(lapply(x, is.numeric))
จากนั้นการตั้งค่ามาตรฐานแบบย่อย
x[ , nums]
## don't use sapply, even though it's less code
## nums <- sapply(x, is.numeric)
สำหรับ R ที่ทันสมัยมากขึ้นตอนนี้ฉันขอแนะนำ
x[ , purrr::map_lgl(x, is.numeric)]
codey น้อยกว่าสะท้อนให้เห็นถึงนิสัยใจคอที่เฉพาะเจาะจงของ R และตรงไปตรงมามากขึ้นและมีประสิทธิภาพในการใช้กับ tibbles ฐานข้อมูลด้านหลัง:
dplyr::select_if(x, is.numeric)
undefined columns selected
เมื่อไม่มีคอลัมน์ตัวเลขข้อผิดพลาดต่อไปนี้เกิดขึ้น คุณจะหลีกเลี่ยงได้อย่างไร
tryCatch()
เพื่อจัดการกับสิ่งนี้ โปรดพิจารณาเปิดคำถามใหม่
select_if(
ฟังก์ชั่นแพคเกจ dplyr เป็นโซลูชั่นที่สง่างาม:
library("dplyr")
select_if(x, is.numeric)
Filter()
จากแพ็คเกจพื้นฐานเป็นฟังก์ชั่นที่สมบูรณ์แบบสำหรับกรณีการใช้งาน: คุณต้องใช้รหัส:
Filter(is.numeric, x)
มันเร็วกว่าselect_if()
:
library(microbenchmark)
microbenchmark(
dplyr::select_if(mtcars, is.numeric),
Filter(is.numeric, mtcars)
)
ส่งคืน (บนคอมพิวเตอร์ของฉัน) เป็นค่ามัธยฐาน 60 microseconds Filter
และ 21 000 microseconds สำหรับselect_if
(เร็วกว่า 350x)
Filter()
ไม่ได้สำหรับที่นี่คือการแทนที่เช่นFilter(is.numeric,iris) <- 0.5*Filter(is.numeric,iris)
จะไม่ทำงาน
ในกรณีที่คุณสนใจเฉพาะชื่อคอลัมน์ให้ใช้:
names(dplyr::select_if(train,is.numeric))
นี่เป็นรหัสสำรองสำหรับคำตอบอื่น ๆ :
x[, sapply(x, class) == "numeric"]
กับ data.table
x[, lapply(x, is.numeric) == TRUE, with = FALSE]
library(purrr)
x <- x %>% keep(is.numeric)
PCAmixdata ไลบรารีมี functionalon splitmix ที่แยกปริมาณ (ข้อมูลตัวเลข) และเชิงคุณภาพ (ข้อมูลเชิงหมวดหมู่) ของ dataframe ที่กำหนด "YourDataframe" ตามที่แสดงด้านล่าง:
install.packages("PCAmixdata")
library(PCAmixdata)
split <- splitmix(YourDataframe)
X1 <- split$X.quanti(Gives numerical columns in the dataset)
X2 <- split$X.quali (Gives categorical columns in the dataset)
วิธีอื่นอาจเป็นดังนี้: -
#extracting numeric columns from iris datset
(iris[sapply(iris, is.numeric)])
หากคุณมีตัวแปรปัจจัยมากมายคุณสามารถใช้ select_if
funtion ติดตั้งแพ็คเกจ dplyr มีฟังก์ชั่นมากมายที่แยกข้อมูลโดยการทำเงื่อนไข คุณสามารถกำหนดเงื่อนไข
ใช้แบบนี้
categorical<-select_if(df,is.factor)
str(categorical)
นี่ไม่ได้ตอบคำถามโดยตรง แต่มีประโยชน์มากโดยเฉพาะถ้าคุณต้องการบางอย่างเช่นคอลัมน์ตัวเลขยกเว้นคอลัมน์ id และตัวแปรตาม
numeric_cols <- sapply(dataframe, is.numeric) %>% which %>%
names %>% setdiff(., c("id_variable", "dep_var"))
dataframe %<>% dplyr::mutate_at(numeric_cols, function(x) your_function(x))
x[nums]
หรือx[sapply(x,is.numeric)]
ทำงานได้ดีdata.frame
และพวกเขามักจะกลับมา เปรียบเทียบx[1]
กับx[,1]
- แรกคือdata.frame
ที่สองคือเวกเตอร์x[, 1, drop=FALSE]
หากหนึ่งต้องการที่จะป้องกันไม่ให้เกิดการแปลงแล้วจะต้องใช้