แปลงรูปแบบคอลัมน์ data.frame จากตัวละครเป็นแฟคเตอร์


153

ผมอยากจะเปลี่ยนรูปแบบ (ชั้น) ของบางคอลัมน์ของวัตถุ data.frame ของฉัน ( mydf) จากฟิกเกอร์เพื่อปัจจัย

ฉันไม่ต้องการทำสิ่งนี้เมื่อฉันอ่านไฟล์ข้อความตามread.table()ฟังก์ชั่น

ความช่วยเหลือใด ๆ ที่จะได้รับการชื่นชม


12
mydf $ myfavoritecolumn <- as.factor (mydf $ myfavoritecolumn)
ทิม riffe

ขอบคุณ! แต่ฉันมีปัญหาอื่น ฉันมีชื่อของแต่ละคอลัมน์ในอาร์เรย์ของอักขระ col_names [] ฉันจะใช้คำสั่งด้านบนได้อย่างไร (mydf $ col_names [i]) ไม่ทำงาน
Rasoul

มีวิธีใดที่จะทำสิ่งนี้โดยอัตโนมัติสำหรับตัวแปรตัวละครทุกตัวตามที่ data.frame ใช้กับ stringsAsFactors?
Etienne Low-Décarie

@ EtienneLow-Décarie: เพียงunclassและใช้data.frameกับผลลัพธ์
IRTFM

คำตอบ:


197

สวัสดียินดีต้อนรับสู่โลกแห่งอาร์

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


ขอบคุณ! แต่ฉันมีปัญหาอื่น ฉันมีชื่อของแต่ละคอลัมน์ในอาร์เรย์ของอักขระ col_names [] ฉันจะใช้คำสั่งดังกล่าว (ค่าmydf$col_names[i]มิได้mydf[,col_names[i]]ไม่ทำงาน.)
Rasoul

1
@Rasoul mydf[, col_names]จะทำสิ่งนี้
DrDom

3
+1 สำหรับผู้อ้างอิง นี่คือสิ่งพื้นฐานซึ่งก็โอเคที่จะถาม แต่ก็ยังดีที่จะต้องตระหนักถึงงานที่กว้างขวางที่ได้รับการใส่ลงไปในงานเหล่านี้ (และคล้ายกัน)
Roman Luštrik

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

นี่เป็นทางออกที่ดีมาก! นอกจากนี้ยังสามารถทำงานกับหมายเลขคอลัมน์ซึ่งอาจมีประโยชน์อย่างยิ่งหากคุณต้องการเปลี่ยนแปลงจำนวนมาก แต่ไม่ใช่ทั้งหมด เช่น col_nums <- c (1, 6, 7: 9, 21:23, 27:28, 30:31, 39, 49:55, 57) จากนั้น df [, col_nums] <- lapply (df [, col_nums] ปัจจัย)
WGray

ข้อแม้: length(col_names)==1วิธีแรกไม่ทำงานถ้า ในกรณีนั้นdf[,col_names]จะถูกลดระดับโดยอัตโนมัติเป็นเวกเตอร์แทนที่จะเป็นรายการความยาว 1 จากนั้นlapplyพยายามดำเนินการกับแต่ละรายการแทนที่จะเป็นคอลัมน์โดยรวม df[,col_names,drop=FALSE]นี้สามารถป้องกันได้โดยใช้
P Schnell

นั่นเป็นจุดที่ดี ภาวนาอื่น ๆ df[col_names]ที่จะรักษาสถานะรายการคือการใช้งาน
IRTFM

27

คุณสามารถใช้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)

18

หากคุณต้องการเปลี่ยนตัวแปรอักขระทั้งหมดใน 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แพ็คเกจและต้องการฝึกแบบจำลองฟอเรสต์แบบสุ่มที่ไม่ยอมรับ ตัวแปรตัวละคร
Sam Firke

13

อีกวิธีสั้น ๆ ที่คุณสามารถใช้ได้คือ pipe ( %<>%) จากแพ็คเกจmagrittr มันจะแปลงmycolumnคอลัมน์อักขระเป็นตัวประกอบ

library(magrittr)

mydf$mycolumn %<>% factor

โปรดแก้ไขด้วยข้อมูลเพิ่มเติม รหัสเท่านั้นและคำตอบ "ลองนี้" จะหมดกำลังใจเพราะพวกเขาไม่มีเนื้อหาที่ค้นหาได้และไม่อธิบายว่าทำไมคนควร "ลองนี้" เราใช้ความพยายามที่นี่เพื่อเป็นแหล่งข้อมูลสำหรับความรู้
Brian Tompsett - 汤莱恩

กรุณาถ้าฉันไม่ต้องการใช้มันสำหรับคอลัมน์ทั้งหมดของ df ของฉัน?
Mostafa

5

ฉันทำมันด้วยฟังก์ชั่น ในกรณีนี้ฉันจะแปลงตัวแปรตัวละครเป็นตัวประกอบ:

for (i in 1:ncol(data)){
    if(is.character(data[,i])){
        data[,i]=factor(data[,i])
    }
}

ฉันเชื่อว่าคุณต้องการวงเล็บสองอันเพื่อแยกคอลัมน์และเปลี่ยนเป็นปัจจัยเช่น[[i]]
RTrain3k
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.