수색…


통사론

  • data.frame (..., row.names = NULL, check.rows = FALSE, check.names = TRUE, stringsAsFactors = default.stringsAsFactors ())

  • as.data.frame (x, row.names = NULL, 옵션 = FALSE, ...) # 일반 함수

  • as.data.frame (x, ..., stringsAsFactors = default.stringsAsFactors ()) 클래스 '문자'에 대한 # S3 메소드

  • as.data.frame (x, row.names = NULL, 옵션 = FALSE, ..., stringsAsFactors = default.stringsAsFactors ()) 클래스 '행렬'

  • is.data.frame (x)

빈 data.frame 만들기

data.frame은 특수한 종류의 목록입니다 : 직사각형 입니다. 목록의 각 요소 (열)는 길이가 같으며 각 행에는 "행 이름"이 있습니다. 각 열에는 고유 한 클래스가 있지만 한 열의 클래스는 다른 열의 클래스와 다를 수 있습니다 (행렬과는 달리 모든 요소는 동일한 클래스를 가져야 함).

원칙적으로 data.frame에는 행이없고 열이 없습니다.

> structure(list(character()), class = "data.frame")
NULL
<0 rows> (or 0-length row.names)

그러나 이것은 드문 경우입니다. data.frame이 많은 열과 많은 행을 갖는 것이 더 일반적입니다. 다음은 3 행 2 열을 갖는 data.frame입니다 ( a 는 숫자 클래스이고 b 는 문자 클래스 임).

> structure(list(a = 1:3, b = letters[1:3]), class = "data.frame")
[1] a b
<0 rows> (or 0-length row.names)

data.frame을 인쇄하려면 몇 개의 행 이름을 제공해야합니다. 여기서 우리는 숫자 1 : 3을 사용합니다.

> structure(list(a = 1:3, b = letters[1:3]), class = "data.frame", row.names = 1:3)
  a b
1 1 a
2 2 b
3 3 c

이제 3 행 2 열의 data.frame이 있다는 것이 분명해졌습니다. nrow() , ncol()dim() 사용하여이를 확인할 수 있습니다.

> x <- structure(list(a = numeric(3), b = character(3)), class = "data.frame", row.names = 1:3)
> nrow(x)
[1] 3
> ncol(x)
[1] 2
> dim(x)
[1] 3 2

R은 data.frame을 만드는 데 사용할 수있는 두 가지 다른 함수 ( structure() 외)를 제공합니다. 첫 번째는 직관적으로 data.frame() 합니다. 제공된 컬럼 이름이 유효하며리스트 요소가 모두 동일한 길이인지 확인하고 자동으로 생성 된 행 이름을 제공하는지 확인합니다. 즉, data.frame() 가 항상 정확히 예상 한 것과 같을 수 있습니다.

> str(data.frame("a a a" = numeric(3), "b-b-b" = character(3)))
'data.frame':   3 obs. of  2 variables:
 $ a.a.a: num  0 0 0
 $ b.b.b: Factor w/ 1 level "": 1 1 1

다른 함수는 as.data.frame() 입니다. 이것은 data.frame이 아닌 객체를 data.frame() 통해 실행함으로써 data.frame으로 강요하는 데 사용될 수 있습니다. 예를 들어, 행렬을 고려하십시오.

> m <- matrix(letters[1:9], nrow = 3)
> m
     [,1] [,2] [,3]
[1,] "a"  "d"  "g" 
[2,] "b"  "e"  "h" 
[3,] "c"  "f"  "i" 

결과 :

> as.data.frame(m)
  V1 V2 V3
1  a  d  g
2  b  e  h
3  c  f  i
> str(as.data.frame(m))
'data.frame':   3 obs. of  3 variables:
 $ V1: Factor w/ 3 levels "a","b","c": 1 2 3
 $ V2: Factor w/ 3 levels "d","e","f": 1 2 3
 $ V3: Factor w/ 3 levels "g","h","i": 1 2 3

데이터 프레임에서 행 및 열 서브 세트 만들기

행과 열에 액세스하기위한 구문 : [ , [[ , $

이 항목에서는 데이터 프레임의 특정 행과 열에 액세스하는 가장 일반적인 구문에 대해 설명합니다. 이것들은

  • 단일 대괄호 data[rows, columns] 있는 matrix 처럼
    • 행 및 열 번호 사용
    • 열 (및 행) 이름 사용
  • list 처럼 :
    • 단일 괄호 data[columns] 를 사용하여 데이터 프레임 가져 오기
    • 벡터를 얻기 위해 이중 대괄호 data[[one_column]]
  • $ 단일 컬럼에 대한 data$column_name

우리는 내장 된 mtcars 데이터 프레임을 사용하여 설명 할 것입니다.

행렬과 마찬가지로 : data[rows, columns]

숫자 인덱스 사용

내장 된 데이터 프레임 mtcars 사용하여 [] 대괄호를 사용하여 쉼표가 포함 된 행과 열을 추출 할 수 있습니다. 쉼표 앞의 색인은 행입니다.

# get the first row
mtcars[1, ]
# get the first five rows
mtcars[1:5, ]

마찬가지로 쉼표가 열인 경우 :

# get the first column
mtcars[, 1]
# get the first, third and fifth columns:
mtcars[, c(1, 3, 5)]

위에 표시된 것처럼 행이나 열을 비워두면 모두 선택됩니다. mtcars[1, ] 모든 열이있는 첫 번째 행을 나타냅니다.

열 (및 행) 이름 사용

지금까지 행렬의 행과 열에 액세스하는 방법과 동일합니다. data.frame 사용하면 대부분의 경우 열 인덱스에 대해 열 이름을 사용하는 것이 좋습니다. 이것은 열 번호가있는 numeric 대신에 열 이름이있는 character 를 사용하여 수행됩니다.

# get the mpg column
mtcars[, "mpg"]
# get the mpg, cyl, and disp columns
mtcars[, c("mpg", "cyl", "disp")]

일반적이지는 않지만 행 이름도 사용할 수 있습니다.

mtcars["Mazda Rx4", ]

행과 열을 함께

행 및 열 인수를 함께 사용할 수 있습니다.

# first four rows of the mpg column
mtcars[1:4, "mpg"]

# 2nd and 5th row of the mpg, cyl, and disp columns
mtcars[c(2, 5), c("mpg", "cyl", "disp")]

크기에 대한 경고 :

이러한 방법을 사용할 때 여러 열을 추출하면 데이터 프레임이 다시 생성됩니다. 그러나 단일 열을 추출하면 기본 옵션 아래에 데이터 프레임이 아니라 벡터가 생성됩니다.

## multiple columns returns a data frame
class(mtcars[, c("mpg", "cyl")])
# [1] "data.frame"
## single column returns a vector
class(mtcars[, "mpg"])
# [1] "numeric"

이 문제를 해결하는 데는 두 가지 방법이 있습니다. 하나는 데이터 프레임을리스트 (아래 참조)로 취급하고, 다른 하나는 drop = FALSE 인수를 추가하는 것입니다. 이것은 R에게 "사용되지 않는 차원을 버리지"말라는 의미입니다.

class(mtcars[, "mpg", drop = FALSE])
# [1] "data.frame"

행렬은 같은 방식으로 작동합니다. 기본적으로 단일 열 또는 행이 벡터가되지만, drop = FALSE 를 지정하면 행렬을 한 행 또는 한 행으로 유지할 수 있습니다.

목록처럼

데이터 프레임은 본질적으로 list . 즉, 열 벡터의 목록입니다 (모두 길이가 같아야 함). 목록은 단일 대괄호 [ 하위 목록의 경우] 또는 이중 대괄호 [[ 단일 요소의 경우 [[ 를 사용하여 부분 집합이 될 수 있습니다.

단일 대괄호 data[columns]

단일 대괄호와 쉼표를 사용하지 않으면 데이터 프레임이 열 목록이므로 열을 다시 가져옵니다.

mtcars["mpg"]
mtcars[c("mpg", "cyl", "disp")]
my_columns <- c("mpg", "cyl", "hp")
mtcars[my_columns]
행렬과 같은 단일 대괄호 대 목록 같은 단일 대괄호

data[columns]data[, columns] 의 차이점은 data.framelist 으로 처리 할 때 괄호 안에 쉼표가없는 경우 반환되는 객체 data.frame 됩니다. 쉼표를 사용하여 matrix 처럼 data.frame 을 처리하면 단일 열을 선택하면 벡터가 반환되지만 여러 열을 선택하면 data.frame 이 반환됩니다.

## When selecting a single column
## like a list will return a data frame
class(mtcars["mpg"])
# [1] "data.frame"
## like a matrix will return a vector
class(mtcars[, "mpg"])
# [1] "numeric"

이중 대괄호 data[[one_column]]

data.framelist 로 취급 할 때 단일 열 을 벡터로 추출하려면 대괄호 [[ . 이 기능은 한 번에 하나의 열에 대해서만 작동합니다.

# extract a single column by name as a vector 
mtcars[["mpg"]]

# extract a single column by name as a data frame (as above)
mtcars["mpg"]

$ 를 사용하여 열에 액세스

따옴표로 묶은 열 이름을 사용하지 않고 마술 단축키 $ 를 사용하여 단일 열을 추출 할 수 있습니다.

# get the column "mpg"
mtcars$mpg

$ 가 액세스하는 열은 항상 데이터 프레임이 아닌 벡터입니다.

의 단점 $ 열을 액세스하기위한

$ 는 편리한 단축키가 될 수 있습니다. 특히이 경우 열 이름을 자동 완성하는 환경 (예 : RStudio)에서 작업하는 경우 편리합니다. 그러나 $ 에는 단점이 있습니다. 따옴표가 필요하지 않도록 비표준 평가 를 사용합니다. 즉, 열 이름이 변수에 저장되어 있으면 작동하지 않습니다 .

my_column <- "mpg"
# the below will not work
mtcars$my_column
# but these will work
mtcars[, my_column]  # vector
mtcars[my_column]    # one-column data frame
mtcars[[my_column]]  # vector

이러한 우려로 인해 열 이름이 일정 할 때 대화 형 R 세션에서 $ 를 사용하는 것이 가장 좋습니다. 프로그래밍 방식으로 사용하는 경우 (예 : 다른 열 이름을 사용하는 다른 데이터 세트에서 사용되는 일반화 가능 함수 작성시) $ 를 피해야합니다.

또한 기본 동작에 의해 (환경 제외) 재귀 객체로부터 추출 할 때 부분적인 일치를 사용하는 점에 유의 $

# give you the values of "mpg" column 
# as "mtcars" has only one column having name starting with "m"
mtcars$m 
# will give you "NULL" 
# as "mtcars" has more than one columns having name starting with "d"
mtcars$d

고급 색인 생성 : 음수 및 논리 색인

인덱스에 숫자를 사용할 수있는 옵션이있을 때마다 음수를 사용하여 특정 인덱스를 생략하거나 부울 (논리) 벡터를 사용하여 정확하게 유지할 항목을 나타낼 수 있습니다.

음수 인덱스는 요소를 생략합니다.

mtcars[1, ]   # first row
mtcars[ -1, ] # everything but the first row
mtcars[-(1:10), ] # everything except the first 10 rows

논리 벡터는 유지할 특정 요소를 나타냅니다.

< 와 같은 조건을 사용하여 논리 벡터를 생성하고 조건을 만족하는 행만 추출 할 수 있습니다.

# logical vector indicating TRUE when a row has mpg less than 15
# FALSE when a row has mpg >= 15
test <- mtcars$mpg < 15 

# extract these rows from the data frame 
mtcars[test, ]

중간 변수를 저장하는 단계를 생략 할 수도 있습니다.

# extract all columns for rows where the value of cyl is 4.
mtcars[mtcars$cyl == 4, ]
# extract the cyl, mpg, and hp columns where the value of cyl is 4
mtcars[mtcars$cyl == 4, c("cyl", "mpg", "hp")]

data.frames를 조작하는 편리한 함수

data.frames 를 조작하는 몇 가지 편리한 함수는 subset() , transform() , with()within() 입니다.

부분 집합

subset() 함수를 사용하면 data.frame 하위 세트를보다 편리하게 사용할 수 있습니다 (하위 세트는 다른 클래스에서도 작동 함).

subset(mtcars, subset = cyl == 6, select = c("mpg", "hp"))
                mpg  hp
Mazda RX4      21.0 110
Mazda RX4 Wag  21.0 110
Hornet 4 Drive 21.4 110
Valiant        18.1 105
Merc 280       19.2 123
Merc 280C      17.8 123
Ferrari Dino   19.7 175

위의 코드에서 우리는 cyl == 6mpghp 열에 대해서만 묻습니다. [] 사용하여 다음 코드를 사용하여 동일한 결과를 얻을 수 있습니다.

mtcars[mtcars$cyl == 6, c("mpg", "hp")]

변환

transform() 함수는 data.frame 내부의 열을 변경하는 편리한 함수입니다. 예를 들어 다음의 코드는 열 추가라는 다른 mpg2 의 결과 mpg^2 받는 mtcars data.frame :

mtcars <- transform(mtcars, mpg2 = mpg^2)

~과 함께

with()within() 모두 data.frame 환경 내에서 표현식을 평가할 수있게하여 좀 더 명확한 구문을 허용하여 일부 $ 또는 [] 의 사용을 절약 할 수 있습니다.

만들려는 예를 들어, 변경 및 / 또는 여러 열을 제거 airquality data.frame :

aq <- within(airquality, {     
    lOzone <- log(Ozone) # creates new column
    Month <- factor(month.abb[Month]) # changes Month Column
    cTemp <- round((Temp - 32) * 5/9, 1) # creates new column
    S.cT <- Solar.R / cTemp  # creates new column
    rm(Day, Temp) # removes columns
})

소개

데이터 프레임은 분석에 가장 많이 사용할 데이터 구조입니다. 데이터 프레임은 다른 클래스의 동일한 길이의 벡터를 저장하는 특수한 종류의 목록입니다. data.frame 함수를 사용하여 데이터 프레임을 만듭니다. 아래 예제는 숫자와 문자 벡터를 데이터 프레임에 결합하여이를 보여줍니다. : 연산자를 사용하여 1에서 3까지의 모든 정수를 포함하는 벡터를 만듭니다.

df1 <- data.frame(x = 1:3, y = c("a", "b", "c"))
df1
##   x y
## 1 1 a
## 2 2 b
## 3 3 c
class(df1)
## [1] "data.frame"

데이터 프레임 객체는 따옴표로 인쇄되지 않으므로 열의 클래스가 항상 명확하지는 않습니다.

df2 <- data.frame(x = c("1", "2", "3"), y = c("a", "b", "c"))
df2
##   x y
## 1 1 a
## 2 2 b
## 3 3 c

추가 조사를하지 않고있는 "X"열 df1df2 구별 할 수 없습니다. str 함수는 클래스보다 세부적인 객체를 설명하는 데 사용할 수 있습니다.

str(df1)
## 'data.frame':    3 obs. of  2 variables:
##  $ x: int  1 2 3
##  $ y: Factor w/ 3 levels "a","b","c": 1 2 3
str(df2)
## 'data.frame':    3 obs. of  2 variables:
##  $ x: Factor w/ 3 levels "1","2","3": 1 2 3
##  $ y: Factor w/ 3 levels "a","b","c": 1 2 3

여기서 df1data.frame 이고 "x"와 "y"라는 3 개의 변수가 있음을 알 수 있습니다. 그런 다음 "x"는 데이터 유형 정수 (이 클래스에는 중요하지 않지만 우리의 목적 상 숫자로 동작 함)와 "y"는 세 가지 수준 (우리가 논의하지 않는 다른 데이터 클래스) 인 요소라고합니다. 기본적으로 데이터 프레임은 문자를 요인으로 강요한다는 점에 유의해야합니다. stringsAsFactors 매개 변수를 사용하여 기본 동작을 변경할 수 있습니다.

df3 <- data.frame(x = 1:3, y = c("a", "b", "c"), stringsAsFactors = FALSE)
str(df3)
## 'data.frame':    3 obs. of  2 variables:
##  $ x: int  1 2 3
##  $ y: chr  "a" "b" "c"

이제 "y"열은 문자입니다. 위에서 언급했듯이 데이터 프레임의 각 "열"은 동일한 길이를 가져야합니다. 길이가 다른 벡터에서 data.frame을 만들려고하면 오류가 발생합니다. (결과 오류를 보려면 data.frame(x = 1:3, y = 1:4) 을 실행 해보십시오.)

데이터 프레임에 대한 테스트 케이스로, 일부 데이터는 기본적으로 R에 의해 제공됩니다. 그들 중 하나는 다음과 같이 적재 된 홍채입니다 :

mydataframe <- iris
str(mydataframe)

do.call을 사용하여 목록에 저장된 데이터를 단일 데이터 프레임으로 변환합니다.

데이터를 목록에 저장하고이 목록을 데이터 프레임으로 변환하려는 경우 do.call 함수를 사용하면이 작업을 쉽게 수행 할 수 있습니다. 그러나 의도하지 않은 값의 재활용을 방지하기 위해서는 모든 목록 요소의 길이가 동일해야합니다.

dataList  <- list(1:3,4:6,7:9)  
dataList
# [[1]]
# [1] 1 2 3
#
# [[2]]
# [1] 4 5 6
#
# [[3]]
# [1] 7 8 9

dataframe <- data.frame(do.call(rbind, dataList))
dataframe
#   X1 X2 X3
# 1  1  2  3
# 2  4  5  6
# 3  7  8  9 

또한 목록이 데이터 프레임 자체로 구성된 경우에도 작동합니다.

dataframeList  <- list(data.frame(a = 1:2, b = 1:2, c = 1:2), 
                       data.frame(a = 3:4, b = 3:4, c = 3:4))
dataframeList
# [[1]]
#   a b c
# 1 1 1 1
# 2 2 2 2

# [[2]]
#   a b c
# 1 3 3 3
# 2 4 4 4

dataframe      <- do.call(rbind, dataframeList)
dataframe
#   a b c
# 1 1 1 1
# 2 2 2 2
# 3 3 3 3
# 4 4 4 4

data.frame의 모든 열을 문자 클래스로 변환

일반적인 작업은 데이터. 프레임을 RDBMS로 보내거나 데이터를 병합하는 경우와 같이 조작이 용이하도록 data.frame의 모든 열을 문자 클래스로 변환하는 것입니다. 입력 데이터간에 레벨이 다를 수있는 요소가 포함 된 프레임을 구성합니다. 프레임 .

이를 수행하는 가장 좋은시기는 데이터를 읽을 때입니다. 데이터 프레임을 만드는 거의 모든 입력 메소드에는 FALSE 로 설정할 수있는 stringsAsFactors 옵션이 있습니다.

데이터가 이미 생성 된 경우 계수 열을 아래 표시된 것처럼 문자 열로 변환 할 수 있습니다.

bob <- data.frame(jobs = c("scientist", "analyst"), 
                  pay  = c(160000, 100000), age = c(30, 25))
str(bob)
'data.frame':    2 obs. of  3 variables:
 $ jobs: Factor w/ 2 levels "analyst","scientist": 2 1
 $ pay : num  160000 100000
 $ age : num  30 25
# Convert *all columns* to character
bob[] <- lapply(bob, as.character)
str(bob)
    'data.frame':    2 obs. of  3 variables:
 $ jobs: chr  "scientist" "analyst"
 $ pay : chr  "160000" "1e+05"
 $ age : chr  "30" "25"
# Convert only factor columns to character
bob[] <- lapply(bob, function(x) {
    if is.factor(x) x <- as.character(x)
    return(x)
})

열 값으로 행 서브 세트하기

내장 함수는 조건을 충족시키는 columns rows 을 부분 집합 할 수 있습니다.

df <- data.frame(item = c(1:10),
                 price_Elasticity = c(-0.57667, 0.03205, -0.04904, 0.10342, 0.04029, 
                                       0.0742, 0.1669, 0.0313, 0.22204, 0.06158),
                 total_Margin = c(-145062, 98671, 20576, -56382, 207623, 43463, 1235, 
                                   34521, 146553, -74516))

price_Elasticity > 0 rows 을 찾으려면 다음을 수행하십시오.

df[df$price_Elasticity > 0, ]

   item price_Elasticity total_Margin
2     2          0.03205        98671
4     4          0.10342       -56382
5     5          0.04029       207623
6     6          0.07420        43463
7     7          0.16690         1235
8     8          0.03130        34521
9     9          0.22204       146553
10   10          0.06158       -74516

price_Elasticity > 0total_Margin > 0 기준으로 한 하위 집합 :

df[df$price_Elasticity > 0 & df$total_Margin > 0, ]

  item price_Elasticity total_Margin
2    2          0.03205        98671
5    5          0.04029       207623
6    6          0.07420        43463
7    7          0.16690         1235
8    8          0.03130        34521
9    9          0.22204       146553


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow