데이터 프레임 열의 데이터 유형 결정


153

R을 사용하고 있으며를 사용하여 데이터를 데이터 프레임에로드했습니다 read.csv(). 데이터 프레임에서 각 열의 데이터 유형을 어떻게 확인합니까?


프로그래밍 방식으로 (예 : sapply(..., class))대화식으로 (예 :) str(...)또는 둘 다?) 일반적으로 프로그래밍 방식으로 확장 성이 더 높으면 Filter(...)정수, 문자, 요인 등을 임의로 목록으로 지정할 수 있습니다. 또는 명명 규칙을 따르는 경우 grep/grepl열 유형을 유추 할 수 있습니다.names(...)
smci

@ smci : 나는 원래 질문에서 '프로그래밍 방식으로'요청하지 않았습니다. 왜 당신이 내 질문의 전체적인 본질을 바꿀지 모르겠습니다.
stackoverflowuser2010

좋아, 그것은 롤백되었다. 그것은 전체적인 본질을 바꾸지 않았고, 두 방향 중 하나로 명확하게했다. 사용 str(...)하는 대화식 접근 방식 은 확장 가능하지 않으며 100 개 미만의 열에서 부족합니다.
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 스레드를 참조하십시오 R. '모드'와 '대해서 typeof' '클래스'과의 사물의 형태의 포괄적 인 조사가 불충분하다 .


1
몇 달 동안 R을 사용한 후 한 번 str(dataframe)에 열 유형을 결정하는 가장 빠른 방법 이라는 것을 알았습니다 . 다른 방법은 더 많은 키 입력이 필요하고 많은 정보를 표시하지 않지만 열 데이터 유형이 다른 함수에 대한 입력 인 경우 유용합니다.
stackoverflowuser2010 년

적용 대신 적용으로 동일한 작업을 수행 한 경우 작동하지 않습니다.
Dom Jo

@DomJo, 왜 사용 apply()하시겠습니까? 그것은 행렬입니다. 데이터 프레임은 (특별한 종류의) 목록입니다.
gung-


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

열 변환 mpgam문자 컬럼에 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.