ฉันจะรับคลาสของคอลัมน์ทั้งหมดใน data frame ได้อย่างไร


85

วิธีง่ายๆในการค้นหาว่าแต่ละคอลัมน์ใน data frame คืออะไร

คำตอบ:


92

ทางเลือกหนึ่งคือการใช้lapplyและclass. ตัวอย่างเช่น:

> foo <- data.frame(c("a", "b"), c(1, 2))
> names(foo) <- c("SomeFactor", "SomeNumeric")
> lapply(foo, class)
$SomeFactor
[1] "factor"

$SomeNumeric
[1] "numeric"

อีกทางเลือกหนึ่งคือstr:

> str(foo)
'data.frame':   2 obs. of  2 variables:
 $ SomeFactor : Factor w/ 2 levels "a","b": 1 2
 $ SomeNumeric: num  1 2

10
เนื่องจากclassส่งคืนเวกเตอร์อักขระของคลาสทั้งหมดที่อ็อบเจ็กต์สืบทอดมาผลลัพธ์ของsapply(foo, class)อาจเป็นรายการไม่ใช่เวกเตอร์อักขระอย่างที่คนส่วนใหญ่คาดหวังเสมอไป ซึ่งอาจเป็นอันตรายได้เล็กน้อย ... ฉันพบว่าlapplyปลอดภัยกว่ามาก
flodel

1
เพื่อให้อ่านง่ายขึ้นฉันขอแนะนำ: unlist(lapply(foo, class))ซึ่งสะดวกสำหรับกรอบข้อมูลที่มีคอลัมน์จำนวนมาก
p130ter

1
unlistด้วยlapplyเป็นความคิดที่แย่มากเพราะเป็นไปได้ว่าlength(class(x))>1 (ดูความคิดเห็นด้านบน) - sapplyปลอดภัยกว่าunlist + lapplyมาก วิธีที่ปลอดภัยคือsapply(lapply(foo, class), "[", 1)- เนื่องจาก foo เป็นกรอบข้อมูล
lebatsnok

28

คุณสามารถใช้ฟังก์ชันlapplyหรือsapplyฟังก์ชันในตัวได้อย่างง่ายดาย

lapplyจะส่งคืนคุณlist-

lapply(dataframe,class)

ในขณะที่sapplyจะใช้ประเภทผลตอบแทนที่ดีที่สุดเท่าที่จะเป็นไปได้เช่น เวกเตอร์ ฯลฯ -

sapply(dataframe,class)

คำสั่งทั้งสองจะส่งคืนชื่อคอลัมน์ทั้งหมดให้กับคุณด้วยคลาสตามลำดับ


1

สวัสดีกำลังมองหาสิ่งเดียวกันและอาจเป็นเช่นกัน

unlist(lapply(mtcars,class))

0

คุณสามารถใช้ได้purrrเช่นกันซึ่งคล้ายกับapplyฟังก์ชันครอบครัว:

as.data.frame(purrr::map_chr(mtcars, class))
purrr::map_df(mtcars, class)

0

ฉันต้องการเอาต์พุตที่กะทัดรัดกว่าคำตอบที่ดีข้างต้นlapplyดังนั้นนี่คือทางเลือกอื่นที่รวมเป็นฟังก์ชันขนาดเล็ก

# Example data
df <-
    data.frame(
        w = seq.int(10),
        x = LETTERS[seq.int(10)],
        y = factor(letters[seq.int(10)]),
        z = seq(
            as.POSIXct('2020-01-01'),
            as.POSIXct('2020-10-01'),
            length.out = 10
        )
    )

# Function returning compact column classes
col_classes <- function(df) {
    t(as.data.frame(lapply(df, function(x) paste(class(x), collapse = ','))))
}

# Return example data's column classes
col_classes(df)
  [,1]            
w "integer"       
x "character"     
y "factor"        
z "POSIXct,POSIXt"

แน่ใจไหมว่าต้องการให้ผลลัพธ์เป็นเมทริกซ์ 1 คอลัมน์ ทำไม? แล้วเวกเตอร์อักขระแทนล่ะ?
nbenn

ได้สิทำไมไม่ส่งคืนเมทริกซ์ 1 คอลัมน์ ฉันระบุว่าโซลูชันนี้มีไว้สำหรับเอาต์พุตขนาดกะทัดรัดซึ่งมีประโยชน์สำหรับการกลับไปตรวจสอบหลังจากจัดการ data.frame เช่น ไม่ได้มีไว้สำหรับการประมวลผลดาวน์สตรีมของคลาสคอลัมน์ คำตอบอื่น ๆ ด้านบนแสดงเวกเตอร์อักขระ
Alec
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.