กำหนดประเภทข้อมูลของคอลัมน์เฟรมข้อมูล


153

ฉันใช้ R และมีข้อมูลที่โหลดลงใน dataframe read.csv()โดยใช้ ฉันจะกำหนดประเภทข้อมูลของแต่ละคอลัมน์ในกรอบข้อมูลได้อย่างไร


โปรแกรม (เช่นsapply(..., class))หรือโต้ตอบ (เช่นstr(...)) หรือทั้งสองอย่างมันมักขยายขีดความสามารถมากขึ้นในการทำโปรแกรมแล้วคุณสามารถพลFilter(...)รายการสำหรับจำนวนเต็มอักขระปัจจัยอื่น ๆ หรือคุณสามารถใช้grep/greplเพื่อสรุปคอลัมน์ประเภทจากnames(...)ถ้าพวกเขาปฏิบัติตามอนุสัญญาการตั้งชื่อ
smci

@smci: ฉันไม่ได้ขอ 'โดยทางโปรแกรม' ในคำถามเดิมของฉัน ฉันไม่รู้ว่าทำไมคุณถึงเปลี่ยนลักษณะทั้งหมดของคำถาม
stackoverflowuser2010

ตกลงมันย้อนกลับ มันไม่ได้เปลี่ยนธรรมชาติทั้งหมดมันทำให้ชัดเจนในหนึ่งในสองทิศทาง วิธีการใช้แบบอินเทอร์แอคทีฟstr(...)นั้นไม่สามารถปรับขนาดได้และมีไอน้ำเหลือน้อยกว่า 100 cols
smci

คำตอบ:


215

?str()ทางออกที่ดีที่สุดของคุณไปยังจุดเริ่มต้นคือการใช้ ในการสำรวจตัวอย่างเรามาสร้างข้อมูลกันเถอะ:

set.seed(3221)  # this makes the example exactly reproducible
my.data <- data.frame(y=rnorm(5), 
                      x1=c(1:5), 
                      x2=c(TRUE, TRUE, FALSE, FALSE, FALSE),
                      X3=letters[1:5])

@ โซลูชั่นของ Wilmer E Henao H นั้นเพรียวมาก:

sapply(my.data, class)
        y        x1        x2        X3 
"numeric" "integer" "logical"  "factor" 

การใช้str()ทำให้คุณได้รับข้อมูลพร้อมกับสินค้าพิเศษ (เช่นระดับของปัจจัยของคุณและค่าแรก ๆ ของแต่ละตัวแปร):

str(my.data)
'data.frame':  5 obs. of  4 variables:
$ y : num  1.03 1.599 -0.818 0.872 -2.682
$ x1: int  1 2 3 4 5
$ x2: logi  TRUE TRUE FALSE FALSE FALSE
$ X3: Factor w/ 5 levels "a","b","c","d",..: 1 2 3 4 5

วิธีการของ @Gavin Simpson นั้นมีความคล่องตัวเช่นกัน แต่ให้ข้อมูลที่แตกต่างกว่าเล็กน้อย class() :

sapply(my.data, typeof)
       y        x1        x2        X3 
"double" "integer" "logical" "integer"

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับclass, typeofและเด็กกลาง, modeดูหัวข้อ SO ยอดเยี่ยม: การสำรวจที่ครอบคลุมของประเภทของสิ่งที่อยู่ในอาร์ 'ในโหมด' และ 'ระดับ' และ 'typeof' จะไม่เพียงพอ


1
หลังจากใช้ R เป็นเวลาหลายเดือนฉันพบว่าstr(dataframe)เป็นวิธีที่เร็วที่สุดในการกำหนดประเภทคอลัมน์ได้อย่างรวดเร็ว วิธีอื่นต้องใช้การกดแป้นมากขึ้นและไม่แสดงข้อมูลมากนัก แต่จะมีประโยชน์หากประเภทข้อมูลคอลัมน์เป็นอินพุตของฟังก์ชันอื่น
stackoverflowuser2010

สวัสดีเมื่อฉันทำแบบเดียวกันกับการสมัครแทนการสมัครงานมันไม่ทำงาน
Dom Jo

@DomJo เหตุผลที่คุณจะใช้apply()? นั่นสำหรับเมทริกซ์ กรอบข้อมูลเป็นรายการ (ชนิดพิเศษ)
gung - Reinstate Monica


18

ฉันจะแนะนำ

sapply(foo, typeof)

ถ้าคุณต้องการเวกเตอร์ชนิดจริงในกรอบข้อมูล class()เป็นสัตว์ที่แตกต่างกันบ้าง

ถ้าคุณไม่จำเป็นต้องได้รับข้อมูลนี้เป็นเวกเตอร์ (เช่นคุณไม่จำเป็นต้องทำอย่างอื่นโปรแกรมในภายหลัง) str(foo)ใช้เพียง

ในทั้งสองกรณีfooจะถูกแทนที่ด้วยชื่อของกรอบข้อมูลของคุณ


7

เพียงส่งเฟรมข้อมูลของคุณไปยังฟังก์ชันต่อไปนี้:

data_types <- function(frame) {
  res <- lapply(frame, class)
  res_frame <- data.frame(unlist(res))
  barplot(table(res_frame), main="Data Types", col="steelblue", ylab="Number of Features")
}

เพื่อสร้างพล็อตของชนิดข้อมูลทั้งหมดในกรอบข้อมูลของคุณ สำหรับชุดข้อมูลม่านตาเราได้รับต่อไปนี้:

data_types(iris)

ป้อนคำอธิบายรูปภาพที่นี่


5

สำหรับเฟรมข้อมูลขนาดเล็ก:

library(tidyverse)

as_tibble(mtcars)

ให้คุณพิมพ์ df ด้วยชนิดข้อมูล

# A tibble: 32 x 11
     mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb
 * <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
 1  21       6  160    110  3.9   2.62  16.5     0     1     4     4
 2  21       6  160    110  3.9   2.88  17.0     0     1     4     4
 3  22.8     4  108     93  3.85  2.32  18.6     1     1     4     1

สำหรับเฟรมข้อมูลขนาดใหญ่:

glimpse(mtcars)

ให้มุมมองที่เป็นโครงสร้างของชนิดข้อมูล:

Observations: 32
Variables: 11
$ mpg  <dbl> 21.0, 21.0, 22.8, 21.4, 18.7, 18.1, 14.3, 24.4, 22.8, 19.2, 17.8, 16.4, 17....
$ cyl  <dbl> 6, 6, 4, 6, 8, 6, 8, 4, 4, 6, 6, 8, 8, 8, 8, 8, 8, 4, 4, 4, 4, 8, 8, 8, 8, ...
$ disp <dbl> 160.0, 160.0, 108.0, 258.0, 360.0, 225.0, 360.0, 146.7, 140.8, 167.6, 167.6...
$ hp   <dbl> 110, 110, 93, 110, 175, 105, 245, 62, 95, 123, 123, 180, 180, 180, 205, 215...
$ drat <dbl> 3.90, 3.90, 3.85, 3.08, 3.15, 2.76, 3.21, 3.69, 3.92, 3.92, 3.92, 3.07, 3.0...
$ wt   <dbl> 2.620, 2.875, 2.320, 3.215, 3.440, 3.460, 3.570, 3.190, 3.150, 3.440, 3.440...
$ qsec <dbl> 16.46, 17.02, 18.61, 19.44, 17.02, 20.22, 15.84, 20.00, 22.90, 18.30, 18.90...
$ vs   <dbl> 0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, ...
$ am   <dbl> 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, ...
$ gear <dbl> 4, 4, 4, 3, 3, 3, 3, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 4, 4, 4, 3, 3, 3, 3, 3, ...
$ carb <dbl> 4, 4, 1, 1, 2, 1, 4, 2, 2, 4, 4, 3, 3, 3, 4, 4, 4, 1, 2, 1, 1, 2, 2, 4, 2, ...

ในการรับรายการประเภทข้อมูลคอลัมน์ (ตามที่กล่าวโดย @Alexandre ด้านบน):

map(mtcars, class)

ให้รายการประเภทข้อมูล:

$mpg
[1] "numeric"

$cyl
[1] "numeric"

$disp
[1] "numeric"

$hp
[1] "numeric"

วิธีเปลี่ยนชนิดข้อมูลของคอลัมน์:

library(hablar)

mtcars %>% 
  convert(chr(mpg, am),
          int(carb))

แปลงคอลัมน์mpgและamเป็นอักขระและคอลัมน์carbเป็นจำนวนเต็ม:

# A tibble: 32 x 11
   mpg     cyl  disp    hp  drat    wt  qsec    vs am     gear  carb
   <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <chr> <dbl> <int>
 1 21        6  160    110  3.9   2.62  16.5     0 1         4     4
 2 21        6  160    110  3.9   2.88  17.0     0 1         4     4
 3 22.8      4  108     93  3.85  2.32  18.6     1 1         4     1
 4 21.4      6  258    110  3.08  3.22  19.4     1 0         3     1

3

เนื่องจากมันไม่ได้ระบุไว้อย่างชัดเจนฉันแค่เพิ่มสิ่งนี้:

ฉันกำลังมองหาวิธีสร้างตารางที่เก็บจำนวนการเกิดขึ้นของชนิดข้อมูลทั้งหมดทั้งหมด

สมมติว่าเรามีdata.frameคอลัมน์สองคอลัมน์และหนึ่งคอลัมน์

dta <- data.frame(a = c(1,2,3), 
                  b = c(4,5,6), 
                  c = c(TRUE, FALSE, TRUE))

คุณสามารถสรุปจำนวนคอลัมน์ของแต่ละประเภทข้อมูลได้

table(unlist(lapply(dta, class)))
# logical numeric 
#       1       2 

สิ่งนี้มีประโยชน์มากหากคุณมีคอลัมน์จำนวนมากและต้องการดูภาพรวมอย่างรวดเร็ว

ที่จะให้เครดิต:วิธีการแก้ปัญหานี้ได้รับแรงบันดาลใจจากคำตอบของ @Cybernetic


2

นี่คือฟังก์ชั่นที่เป็นส่วนหนึ่งของแพ็คเกจhelpRFunctionsที่จะส่งคืนรายการชนิดข้อมูลทั้งหมดในกรอบข้อมูลของคุณรวมถึงชื่อตัวแปรเฉพาะที่เชื่อมโยงกับประเภทนั้น

install.package('devtools') # Only needed if you dont have this installed.
library(devtools)
install_github('adam-m-mcelhinney/helpRFunctions')
library(helpRFunctions)
my.data <- data.frame(y=rnorm(5), 
                  x1=c(1:5), 
                  x2=c(TRUE, TRUE, FALSE, FALSE, FALSE),
                  X3=letters[1:5])
t <- list.df.var.types(my.data)
t$factor
t$integer
t$logical
t$numeric

var(my.data[t$numeric])จากนั้นคุณสามารถทำสิ่งที่ชอบ

หวังว่านี่จะเป็นประโยชน์!


1
น่าสังเกตว่าภายใต้ประทุนนี้เป็นlapply(your_data, class)บิตของการประมวลผลพิเศษสำหรับการจัดรูปแบบ
Gregor Thomas

1

หากคุณนำเข้าไฟล์ csv เป็น data.frame (และไม่ใช่เมทริกซ์) คุณสามารถใช้ summary.default

summary.default(mtcars)

     Length Class  Mode   
mpg  32     -none- numeric
cyl  32     -none- numeric
disp 32     -none- numeric
hp   32     -none- numeric
drat 32     -none- numeric
wt   32     -none- numeric
qsec 32     -none- numeric
vs   32     -none- numeric
am   32     -none- numeric
gear 32     -none- numeric
carb 32     -none- numeric

1

อีกทางเลือกหนึ่งคือการใช้ฟังก์ชั่นแผนที่ของแพ็คเกจ purrr

library(purrr)
map(df,class)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.