ผมอยากจะเปลี่ยนรูปแบบ (ชั้น) ของบางคอลัมน์ของวัตถุ data.frame ของฉัน ( mydf) จากฟิกเกอร์เพื่อปัจจัย
ฉันไม่ต้องการทำสิ่งนี้เมื่อฉันอ่านไฟล์ข้อความตามread.table()ฟังก์ชั่น
ความช่วยเหลือใด ๆ ที่จะได้รับการชื่นชม
unclassและใช้data.frameกับผลลัพธ์
ผมอยากจะเปลี่ยนรูปแบบ (ชั้น) ของบางคอลัมน์ของวัตถุ data.frame ของฉัน ( mydf) จากฟิกเกอร์เพื่อปัจจัย
ฉันไม่ต้องการทำสิ่งนี้เมื่อฉันอ่านไฟล์ข้อความตามread.table()ฟังก์ชั่น
ความช่วยเหลือใด ๆ ที่จะได้รับการชื่นชม
unclassและใช้data.frameกับผลลัพธ์
คำตอบ:
สวัสดียินดีต้อนรับสู่โลกแห่งอาร์
mtcars #look at this built in data set
str(mtcars) #allows you to see the classes of the variables (all numeric)
#one approach it to index with the $ sign and the as.factor function
mtcars$am <- as.factor(mtcars$am)
#another approach
mtcars[, 'cyl'] <- as.factor(mtcars[, 'cyl'])
str(mtcars) # now look at the classes
นอกจากนี้ยังใช้กับอักขระวันที่จำนวนเต็มและคลาสอื่น ๆ
เนื่องจากคุณใหม่กับ R ฉันขอแนะนำให้คุณดูที่เว็บไซต์ทั้งสองนี้:
คู่มืออ้างอิง R: http://cran.r-project.org/manuals.html
R บัตรอ้างอิง: http://cran.r-project.org/doc/contrib/Short-refcard.pdf
mydf$col_names[i]มิได้mydf[,col_names[i]]ไม่ทำงาน.)
mydf[, col_names]จะทำสิ่งนี้
# To do it for all names
df[] <- lapply( df, factor) # the "[]" keeps the dataframe structure
col_names <- names(df)
# do do it for some names in a vector named 'col_names'
df[col_names] <- lapply(df[col_names] , factor)
คำอธิบาย dataframes ทั้งหมดอยู่ในรายการและผลของการใช้กับการขัดแย้งมูลค่าหลายรายการเช่นเดียวกันดังนั้นวนลูปกับรายการเป็นงานของ[ lapplyการมอบหมายข้างต้นจะสร้างชุดรายการที่ฟังก์ชั่นdata.frame.[<-ควรติดกลับเข้าไปใน dataframe ได้สำเร็จdf
กลยุทธ์อื่นคือการแปลงเฉพาะคอลัมน์เหล่านั้นที่มีจำนวนรายการที่ไม่ซ้ำกันน้อยกว่าเกณฑ์บางอย่างสมมติว่าน้อยกว่าบันทึกของจำนวนแถวเป็นตัวอย่าง:
cols.to.factor <- sapply( df, function(col) length(unique(col)) < log10(length(col)) )
df[ cols.to.factor] <- lapply(df[ cols.to.factor] , factor)
length(col_names)==1วิธีแรกไม่ทำงานถ้า ในกรณีนั้นdf[,col_names]จะถูกลดระดับโดยอัตโนมัติเป็นเวกเตอร์แทนที่จะเป็นรายการความยาว 1 จากนั้นlapplyพยายามดำเนินการกับแต่ละรายการแทนที่จะเป็นคอลัมน์โดยรวม df[,col_names,drop=FALSE]นี้สามารถป้องกันได้โดยใช้
df[col_names]ที่จะรักษาสถานะรายการคือการใช้งาน
คุณสามารถใช้dplyr::mutate_if()ในการแปลงคอลัมน์อักขระทั้งหมดหรือdplyr::mutate_at()สำหรับคอลัมน์อักขระที่มีชื่อให้เลือกเป็นปัจจัย:
library(dplyr)
# all character columns to factor:
df <- mutate_if(df, is.character, as.factor)
# select character columns 'char1', 'char2', etc. to factor:
df <- mutate_at(df, vars(char1, char2), as.factor)
หากคุณต้องการเปลี่ยนตัวแปรอักขระทั้งหมดใน data.frame ของคุณเป็นปัจจัยหลังจากที่คุณโหลดข้อมูลของคุณไปแล้วคุณสามารถทำได้เช่นนี้เป็น data.frame ที่เรียกว่าdat:
character_vars <- lapply(dat, class) == "character"
dat[, character_vars] <- lapply(dat[, character_vars], as.factor)
สิ่งนี้จะสร้างเวกเตอร์ที่ระบุว่าคอลัมน์ใดเป็นชั้นเรียนcharacterจากนั้นนำas.factorไปใช้กับคอลัมน์เหล่านั้น
ข้อมูลตัวอย่าง:
dat <- data.frame(var1 = c("a", "b"),
var2 = c("hi", "low"),
var3 = c(0, 0.1),
stringsAsFactors = FALSE
)
stringsAsFactors = TRUEแต่สิ่งนี้มีประโยชน์เมื่อพูดว่าคุณอ่านข้อมูลด้วยread_excel()จากreadxlแพ็คเกจและต้องการฝึกแบบจำลองฟอเรสต์แบบสุ่มที่ไม่ยอมรับ ตัวแปรตัวละคร
อีกวิธีสั้น ๆ ที่คุณสามารถใช้ได้คือ pipe ( %<>%) จากแพ็คเกจmagrittr มันจะแปลงmycolumnคอลัมน์อักขระเป็นตัวประกอบ
library(magrittr)
mydf$mycolumn %<>% factor
ฉันทำมันด้วยฟังก์ชั่น ในกรณีนี้ฉันจะแปลงตัวแปรตัวละครเป็นตัวประกอบ:
for (i in 1:ncol(data)){
if(is.character(data[,i])){
data[,i]=factor(data[,i])
}
}
[[i]]